This file is not empty; it just begins with a few blank lines due to preprocessing: :Help file revision:Revision history: Help file revision: $Id: hyperhelp.src,v 3.46 1996/08/21 16:54:25 lupus Exp lupus $ :contents:What is Xfinans?: Welcome to Xfinans This is a "hypertext" document, containing __links__ to other parts of the document. As you see, a link is one or more words between double underscores. You can follow a link by clicking your left mouse button at the word between the double underscores. Go ahead, try one of the __links__ here! Contents of this help text: 0) How to __navigate__ this hypertext thing 1) __What is Xfinans?__ 2) The __functions__ of Xfinans 2.1) The __account functions__ (the upper row of buttons) 2.2) The __transaction functions__ (the lower row of buttons) 3) Contacting the __author__, and __copyright-stuff__ 4) __Revision history__ 5) __Command line options__, and __Environment variables__ 6) Alphabetical __index__ of functions Click one of the above links, or the "Next" button to move on. :links:contents: Yes, that's it. Now follow the __contents__ link back to the previous text. :What is Xfinans?:main window: 1. What is Xfinans? Xfinans is a program that is meant to provide an overview over the balances of your bank accounts. Its basic philosophy is that you enter the date, a description, and the amount of each transaction you perform, and Xfinans saves the transactions and calculates the balance corresponding to each transaction. In addition, Xfinans lets you search your transactions for some substring, calculate interest, or plot the balances as a function of time (plotting requires the "Gnuplot" program, however). Click "Next" to continue. :comment:comment: Xfinans is originally developed with Danish titles and labels - that's why it is still called "Xfinans" instead of "Xfinance" or something similar. Anyway, "finance" is a somewhat pretentious name, since the program's functionality is really rather simple and limited. :main window:functions: The program's main window consists of six parts, here described from top to buttom: 1) A row of buttons for selecting, creating, and deleting accounts, transferring from one account to another, and leaving the program 2) A list of accounts 3) A row of buttons for creating, editing, and deleting transactions (and a few other functions) 4) A header describing the columns of part 5) 5) A list of the transactions in the currently selected account 6) Two input fields for supplying a __date range__ for transactions to be shown in part 5) The following sections describe each of the functions of Xfinans. Click "next" to move on. :functions:account functions: 2. The functions of Xfinans First a few general things to note about Xfinans: - where floating point numbers are entered, you may use either '.' or ',' as decimal point. - transactions contain either a positive or a negative amount. The sign indicates whether a transaction is a deposit or a withdrawal. - from release 5.3, you can choose between two methods for moving the input focus between input fields. Either by moving the mouse pointer (the default), or controlled from the keyboard (e.g. with arrow/tab/return keys). See __input focus__ for details. Continue with __account functions__ (follow link or click "Next") __transaction functions__ :input focus:Environment variables: Input focus. From release 5.3, you can choose between two methods for moving the input focus between input fields: 1) By moving the mouse pointer 2) By pressing selected keys on the keyboard The default is 1). You can select method 2) by setting the environment variable XFINANSFOCUS to "keyboard" (see also __Environment variables__). To define the keybindings used with the keyboard focus method, edit the XFinans application defaults file. The following actions can be bound to events: next-action() Move focus to the next field prev-action() Move focus to the previous field here-action() Move focus to this field (i.e. the field in which the event happens) confirm-action() Confirm the operation, usually equivalent to clicking an "OK" button. The default bindings are the following: XFinans*Text.Translations: #override \ Tab: next-action() \n\ Down: next-action() \n\ Up: prev-action() \n\ Return: confirm-action() \n\ KP_Enter: confirm-action() \n\ :: here-action() The here-action() allows you to set the focus with the mouse, here by clicking the right mouse button in the desired input field, even when keyboard focus is selected. :Detail:contents: The "__Detail__:" subsections contain minor points that are less important in a first reading. Click "Back" to return to your previous text. :account functions:transaction functions: 2.1. The account functions You should see the following buttons at the top of your Xfinans main window: __open__ one of the existing accounts listed in the account list. __create__ a new account. __delete__ the selected account. __transfer__ an amount from one account to another. __quit__ Xfinans. :open:create: Open Open one of the existing accounts listed in the account list, i.e. display the transactions and balance of the account. First select the desired account by pointing and clicking in the account list. Then click 'Open'. You may also open an account simply by double-clicking it in the account list. The transactions of the opened account are displayed in the transaction list. For each transaction is shown the date, a describing text, the amount (positive or negative), and the balance of the account after the transaction. Other fields are displayed if selected on the __options__ menu. :this is a comment:this is a comment: __Detail__: By default, Xfinans shows only the N most recent transactions of the account, where N is the number of transactions that will fit in the window. See the description of the button __misc__, and its sub-entry __limit trans.list by date__, for how to change this behavior. :create:delete: Create Create a new account. Fill in the three fields in the pop-up window: 'File name', 'Name', and 'Account no'. The 'file name' field names the file that will contain the transactions of the new account. You can choose file names as you like, but I suggest that you DON'T postfix them with a number, like "file.1", "file.2" etc., since such file names are used for temporary files by the plotting function. The 'account number' may contain arbitrary characters - it needs not be an integer. Click 'Ok' or press return to complete the operation. __Detail__: If an account in the account list is selected when 'Create' is activated, then the new account will be inserted in the list at the position just before the selected one. If no account is selected, then the new account is inserted as the last in the list. :selected:contents: To "select" a transaction or an account, single-click the desired item in the transaction- or account list. Click 'back' to return to the previous text. :delete:transfer: Delete Delete the __selected__ account. It may be confusing that the main window contains two 'Delete' buttons - but remember that the upper buttons concern ACCOUNTS, whereas the lower buttons concern TRANSACTIONS. Click the account you wish to delete. Then click the 'delete' button. Note that it is the SELECTED (i.e. highlighted) account in the account list that is deleted - not the OPEN account. These need not be the same. __Detail__: Deleting an account affects the account list only. It does not involve a "physical" deletion of the transaction file. This may be considered a safety feature :-) :transfer:quit: Transfer Transfer an amount from one account to another. The invocation of this function is somewhat unusual: Click the account to transfer FROM Click the account to transfer TO Click the 'Transfer' button A transfer window pops up. Fill in the 'date' field - for convenience, you may use the 'Today' button to fill in the current date, and the '+'/'-' buttons to increase/decrease the date. The '+M'/'-M' buttons increase/decrease the date by one month. The 'transaction number' field is preset with a new transaction number which you can modify as desired. In most cases you will not want to write anything in the 'text' field. An appropriate text is generated automatically. Fill in the 'amount' field. In most cases, you will write the amount without sign, since it is then withdrawn from the "FROM" account and deposited on the "TO" account. Click 'Ok' or press return to complete the operation. A transfer operation results in two independent "physical" transactions: the withdrawal and the deposit. This means that if you later edit or delete, say, the withdrawal transaction, then the corresponding deposit is NOT automatically updated. __Detail__: If you select a transaction (by clicking on it in the transaction list) before activating 'Transfer', then the selected transaction is used as a template for the new transactions. :quit:account functions: Quit Exit from Xfinans. :transaction functions:author: 2.2. The transaction functions You should see the following buttons somewhere in the middle of your Xfinans main window: __new__ Enter a new transaction in the open account. __edit__ Edit the selected transaction. __delete __ Delete the selected transaction. __commit__ Commit/uncommit the selected transaction. __misc__ Activates a pop-up menu with various extra functions __options__ Activates a configuration pop-up menu __help__ Pops up this window. :new:edit: New Enter a new transaction in the __open__ account. Pops up a transaction window. Fill in the 'date' field - for convenience, you may use the 'Today' button to fill in the current date, and the '+'/'-' buttons to increase/decrease the date. With each transaction is associated a repeat period - which defaults to one month. The 'incr'/'decr' buttons increase/decrease the date by this repeat period. The length of the repeat period is given in the 'by' field. The unit (day, week, month etc.) is selected on the 'unit' menu. Note that the repeat period doesn't imply that transactions are repeated automatically. It is thought as help when you need to enter e.g. periodical payments: You only have to set the period once, and then click "new (transaction)" -> "incr" -> "ok" the desired number of times. Or you can select an existing payment, and click "new (transaction)" -> "incr" -> "ok" to enter the following payment. From version 5.7 it is also possible to set up automatic recurring transactions, see __recurring__ under the __misc__ menu. The 'transaction number' field is preset with a new transaction number which you can modify as desired. The 'category number' field lets you specify a category for this transaction. See __categories__ for a description of the category concept. Since category numbers are rather hard and boring to remember, you can open the __category window__ via the __misc__ menu and use the category list there to pick the desired category. Clicking a category in the list inserts the selection in the 'category number' field in the 'transaction' window. In the 'text' field, you can enter a description/comment. In the 'amount' field, prefix the amount with "-" if the transaction is a withdrawal. You can also set the sign of the transaction with the 'income'/'payment' buttons. Click 'Ok' or press return to complete the operation. The 'clear all' button clears the three input fields. __Detail__: If you have __selected__ a transaction before activating 'new', then the selected transaction is used as a template for the new transactions. However, the transaction number is NOT copied from the selected transaction. A new number is generated instead. :edit:delete : Edit Edit the __selected__ transaction. First select the desired transaction by clicking it in the transaction list, then click 'edit'. Alternatively, you can double-click a transaction to edit it. A pop-up window equal to the one used by '__new__' is displayed. See __new__ for further description. :delete :commit: Delete Delete the __selected__ transaction. First select the desired transaction by clicking it in the transaction list, then click 'delete'. :commit:misc: Commit Commit/uncommit the __selected__ transaction. First select the desired transaction by clicking it in the transaction list, then click 'commit'. Each transaction has associated a "committed" flag. When you enter a __new__ transaction, it is not yet committed. This is done with 'commit'. The committed scheme allows you to maintain two running balances for each account: One for your private bookkeeping and one for the transactions as registered by your bank. The idea is that you can enter your transactions in the sequence you perform them, and then 'commit' each transaction as your bank confirms it. The function __show committed__ at the __misc__ menu shows the balance calculated from the committed transactions. Clicking 'commit' on a committed transaction "uncommits" the transaction. :misc:options: Misc Activates a pop-up menu with the following entries: __print__ Print the transactions of the open account. __search__ Search the transactions of the open account for a specified substring. Also used for customized sorting of the transactions. __interest__ Calculate interest for the open account. __plot__ Plot the balance of the open account. __list balances__ List the current balances of a set of accounts. __recurring__ Enter/edit recurring transactions. __categories__ List/create/edit categories. :print:search: Print Print the transactions of the __open__ account. A small pop-up window requests the date of the first transaction to be included in the printing, i.e. only newer transactions are printed. If no date is supplied, then all transactions of the account are printed. The printed output format is mostly identical to the selected format of the transaction list in the main window, e.g. concerning __date format__ and columns displayed. However, the "committed balance" column is only supported with __ASCII text__ output. Note that the __print command__ issued by Xfinans can be selected on the __options__ menu, where either __PostScript__(TM) or __ASCII text__ output is also selected. :search:interest: Search Search the transactions of the __open__ account for a specified substring and/or sort the transactions in a user defined order. Pops up the 'search & sort' window. It contains two input fields: one for the search substring and one for a string that encodes the sorting order (described below). Xfinans first performs the search, and then sorts the matching transactions (if any). You can supply the desired substring in the 'search for' field, or you can leave it empty in which case all transactions will match the search -- this is useful when you don't want to perform a search, but rather want to have all the transactions sorted. The search is case-insensitive. The string in the 'sorting order' field should consist of the following characters: a (amount) c (commit) d (date) n (transaction number) t (text) y (category number) or their uppercase equivalents A, C, D, N, T, Y. The first character in the string denotes the primary sorting criteria, the second character the secondary, and so on. Lowercase chars means increasing order, uppercase chars means decreasing. Example: sorting order == tdA sorts the transactions first alphabetically (lexically increasing), then by increasing date (where transactions had the same text), and finally by decreasing amount (where both text and date were equal). The sorting order field may also be left blank, in which case no sorting takes place - i.e. transactions are listed in the same order as in the main window. Click the 'search' button or press return to perform the search and/or sort of the transactions in the open account. Matching transactions are listed in the search window. Their amounts are added together, and their sum is displayed in the 'sum' column of the search window. If you leave the search window open and then open another account, then a new search and/or sort is automatically performed in the new account. Matching transactions replace the previous contents of the search window. :interest:plot: Interest Calculate interest for the __open__ account. Pops up the interest window. In this window, fill in the 'from date', 'to date', and 'interest rate' fields. Then click the 'calculate' button. The result is shown in the interest window as a potential new transaction. This transaction can be inserted in the account with the 'add interest' button. Otherwise, the window can be closed with the 'cancel' button. __Detail__: I'm not a banker, and the interest calculation may not be correct. But it does its best to calculate the interest based on the number of days of each balance. In order to take leap years into account, a year is defined as 365.25 days, which is not exact. :plot:list balances: Plot Plot the balance of the __open__ account as a function of time. Pops up the plot control window. In this window, you can fill in the 'from date' and 'to date' fields to limit the period covered by the plot. Then click 'plot'/press return. This function requires that the program "Gnuplot" can be called by Xfinans, since Gnuplot is used for the actual plotting. If all goes well, a Gnuplot window pops up with a graph. The unit of the X-axis is the number of days counted from the supplied 'from date'. The unit of the Y-axis is what-ever currency you use for your transactions. You may add additional graphs to the same plot simply by opening another account and clicking 'plot' in the plot control window again (see the 'Detail' below, however). The 'reset' button is used for clearing the plot: It removes all graphs from the plot window and then replots the open account. You can add a line displaying the average balance of the open account to the plot via the __avg.__ button. The 'close' button closes Gnuplot and the plot control window. __Detail__: If no 'from date' is entered, then the days of the X-axis are counted from the date of the first transaction in the plotted account. For this reason, a 'from date' should always be entered when more than one graph is plotted in the graph window, otherwise the graphs may not be properly X-aligned. :avg.:plot: Display the average balance of the __open__ account in the plot window. In order to use this feature, you MUST fill in the "from date" and "to date" fields in the plot control window. __Detail__: If you click 'avg.' as the first thing after you open the plot control window, then the balance of the open account is plotted as well as the average balance. :list balances:recurring: List balances List the current balances of a set of accounts. Pops up the 'current balances' window. Initially, the list is empty. Each time you open an account USING THE '__open__' BUTTON (not by double-clicking), the current balance of the account is added to the balance list. By subsequently opening the desired set of accounts, their respective current balances are added to the list, and the sum of the balances is shown in the 'sum' field. You can remove a single account from the balance list simply by clicking the account in the balance list. The whole balance list can be cleared using the 'clear all' button. :recurring:categories: Recurring transactions Pops up the "recurring transactions" window. This window contains a list of the transactions that have been entered as recurring, and a set of buttons to manipulate this set of recurring transactions. Recurring transactions are like "ordinary" transactions, except that they are automatically repeated with a given period. The mechanism makes the program check at each start-up which recurring transactions have happened since last "run"/start-up. For each such recurring transaction, the usual "new transaction" pop-up is presented for confirmation. The buttons shown in the window are the following: __new __ enter a new recurring transaction edit edit an existing recurring transaction delete delete a recurring transaction __run __ run the recurring transactions up to some given date close close the "recurring transactions" window :new :run : Enter a new recurring transaction Pops up a window which in most respects is equal to the usual "new transaction" window (see also __new__ transaction). The main difference is that the "recurring transaction" window contains two fields for specifying a "from" and a "to" account. The "from" account should always be specified, whereas "to" account is only specified if the transaction is to be a transfer. These account fields are not directly editable, the accounts must be selected via the account list in the main window. When accounts are clicked in the account list, they are filled into the "from" and "to" fields, alternatingly. The account name and -number are used as identification of the account. Therefore, this combination must be unique among accounts (This is noted here because this requirement is introduced with the "recurring transaction" feature). :run :recurring: Run the recurring transactions up to some given date It is sometimes desirable to run the recurring transactions up to some point in the future. This is possible with this function, which pops up a dialog window requesting the date to run the recurring transactions up to. Note that the use of "run" is optional. Xfinans automatically performs a "run" up to the current date at each start-up. :categories:misc: Categories This menu entry pops up the category window. The category concept is somewhat complicated, and the description is therefore split up into the following parts: main __principles and ideas__ __category window__ and its functions __category definitions__ category-related __variables__ and support routines :principles and ideas:category window: Categories: the principles and ideas The idea behind the category concept in Xfinans is to allow transactions to be associated with a "logical" category as well as with the "physical" account a transaction belongs to (in the usual Xfinans "account" sense). Categories are similar to accounts in that they (logically) contain a set of transactions from which a balance can be calculated and displayed. They differ from accounts in that the accounts "own" the transactions; transactions must be entered, edited, deleted etc. via an account, this cannot be done directly via categories. The contents of the categories are thus derived from the contents of the accounts. You can define the set of categories, for instance "salary", "car expences", "misc. expences" and whatever you would like to categorize your transactions into. A category consists of a unique number, a name, and a definition (more about the __category definitions__ follow). You can then associated each transaction with a category by entering the category number in the "category" field in the transaction pop-up window. An important characteristic of categories is that they can be used to perform additional calculation on the transactions. A few examples: - Categories can be "linked", i.e. each transaction entered in category "X" can be automatically copied to categories "Y" and "Z". This is useful for making "total" categories, for instance if we have the categories "salary" and "misc.income", then we can set up the category definitions to copy each transaction entered in each of these categories to the category "total income". - Transactions entered in a category can be modified in arbitrary ways before they are actually added to the category. It is thus possible to e.g. split up the amount of each transaction (for instance in the amount before tax, to be entered in one category, and the tax to be entered in a separate category). The key to these possibilities is in the __category definitions__. A category definition is a piece of Perl code, so some knowledge of this extremely useful language is probably an advantage. However, basic use of Xfinans categories should be possible given the description in this document. :category window:category definitions: The category window Contains a list of categories, some buttons, and a name input field. The "name" field lets you enter a substring of category names; clicking "filter" (or hitting the key) then shows the categories whose names match the given substring in the category list. To see all categories, clear the "name" field and click "filter" again. The "new" button lets you create a new category. It can also be used to EDIT a category; just highlight the desired category in the list before clicking "new", then the selected category will be taken as a template. The general clue is that entering a new category with the same number as an existing category will replace the old one. The "new category" window contains three input fields; "number", "name", and "definition". [Note about the keyboard inputfocus selection mechanism: in the "definition" field, multiline text is supported, which means that up/down arrow keys can't move the input focus out of this field; use the key instead] See __category definitions__ for a description of the syntax and semantics of the "definition" field's contents. The "delete" button deletes the selected category. The "variables" button pops up a window where various variables and support routines can be defined, see __variables__. The "list" and "balance" buttons call a Perl engine to perform calculations. It may take a while before the result shows up, but if nothing happens, then check that you have Perl installed and reachable from your PATH. The __variables__ affect the "list" and "balance" display, e.g. by defining the first and last dates of transactions to be displayed. The "list" button pops up a window displaying the transactions in the selected category. The "balance" button displays the balance of all categories; three figures are calculated for each category: the initial (opening) balance at the "from" date (in __variables__), the closing balance at the "to" date, and the difference between the two (closing - opening balance). :category definitions:variables: Category definitions The Perl code in a category definition can be thought of as the body of a procedure which is called with each transaction you enter (via an account) in the particular category. The transaction is accessible as "parameter" in a category definition in form of the following Perl variables: $catNum the transaction's category number. This parameter is somewhat redundant, since the category number is implicitly given by the context of the category definition. $date the transaction's date. All dates in the category subsystem have the format yyyymmdd, independent of the selected date format in Xfinans. $transNum transaction number. $text transaction text. $amount transaction amount (negative if withdrawal). $commit 1 if the transaction is committed, 0 otherwise. You can write any Perl code in the category definition that uses and modifies these variables. To actually add the transaction to the category, you can call the pre-defined procedure enter(): &enter($catNum, $date, $transNum, $text, $amount, $commit); (note the '&' sign on procedure calls in Perl; I tend to forget it most of the time :-) This call adds the transaction given by the above parameters to the category $catNum without further processing (that is, without calling the category definition (again)). This procedure is the most basic building element for category definitions. If you don't need to modify the transaction (i.e. change any of the above parameters that represent it) before you call enter(), then you can use one of the more convenient procedures std_income() and std_expense() instead; they are simple procedures without parameters, and they simply call enter() with the parameters above: sub std_income { #enter the transaction without modification &enter($catNum, $date, $transNum, $text, $amount, $commit); } sub std_expense { #change the sign of the amount, to have positive numbers in the #category &enter($catNum, $date, $transNum, $text, -$amount, $commit); } Thus a simple category definition can consist of a single call, e.g.: &std_income(); Now for the more interesting possibilities. You can define your own "global" variables and support routines in the __variables__ window; these variables and procedures will be accessible in all category definitions. This is useful e.g. for defining tax rates and procedures for calculating the tax-part of a given amount. See __variables__ for an example. When categories are to be "linked" together, i.e. transactions in one category are to be copied to other categories as well, then the enter() procedure described above is often not satisfactory. enter() _can_ be used, as in the following example category definition (assume this category definition is for category number 100): #enter transaction in "this" category: $firstCategory = 100; &enter($firstCategory, $date, $transNum, $text, $amount, $commit); #also enter a copy in category 200: $secondCategory = 200; &enter($secondCategory, $date, $transNum, $text, $amount, $commit); The problem is that enter() adds the "raw" transaction to category 200 without further processing; in most cases we would like to call THE DEFINITION of category 200 with the transaction instead, so that the transaction can be further processed at that point -- and perhaps even be modified/distributed further to other categories, according to the definition of category 200. To allow this, there exists another pre-defined procedure, recursiveEnter(). It is equal to enter() except that it calls the category definition with the transaction as parameter instead of directly adding the transaction to the category. &recursiveEnter($catNum, $date, $transNum, $text, $amount, $commit); Obviously, care must be taken with recursiveEnter() to avoid infinite recursion -- usually you will not want to call recursiveEnter($categoryNumber, ...) from within the definition of the category $categoryNumber itself! As with enter(), there is also a simplified version of recursiveEnter() called copy_to(). As its name indicates, it is intended for copying the transaction to another category: sub copy_to { local($catN) = @_; &recursiveEnter($catN, $date, $transNum, $text, $amount, $commit); } copy_to() takes a single parameter which is the destination category number. As with recursiveEnter(), you will probably not want to call copy_to($categoryNumber) from within the definition of the category $categoryNumber. As an example, assume that category 100 is "salary" and that category 200 is "total income". We wish to set up a link that copies each transaction in category 100 to category 200. The definition of category 100 could be: #enter the transaction in "this" category (salary) $std_income(); $copy_to(200); And the definition of category 200: #enter the transaction in "this" category (total income) $std_income(); Note that it is completely up to the category definition to decide what to do with "incoming" transactions (i.e. transactions entered directly by you via the accounts or indirectly via recursiveEnter() ) -- if a category definition is empty, incoming transactions are simply ignored. :variables:categories: Variables The "variables" button in the __category window__ pops up the display of the Perl variables and routines for use in the category definitions. The view of the variables is editable. There are two pre-defined variables, $fromDate and $toDate, which you can set as desired. Only transactions within this period are included by the "list" category function. Note that all dates in the category subsystem have the format yyyymmdd, independent of the date format otherwise selected in Xfinans. You can also define your own "global" variables and support routines; these variables and procedures will be accessible in all __category definitions__. This is useful e.g. for defining tax rates and procedures for calculating the tax-part of a given amount, for instance: #Danish sales tax rate $danish_tax_rate = 0.25; #function to calculate sales tax sub the_tax_of { # calculate the tax of parameter local($amount) = @_; # use: tax = &the_tax_of(1000); return $amount*$danish_tax_rate; } :date range:default date range: Transaction list date range It is possible to limit the transactions displayed in the list to those within a given period. In order to use this feature, be sure to select __limit trans.list by date__ on the __options__ menu. The period (date range) is given by the two date input fields at the bottom of the __main window__. Any of these input fields may be left empty in which case no "from" and/or "to" date limit is set, and all past and/or future transactions in the account will be displayed. It is also possible to set up a __default date range__ which the program then uses to fill in default values in the two date input fields at each start-up. :default date range:number of decimals: Transaction list default date range This entry on the __options__ menu lets you specify a default __date range__ which is then used to fill in default values in the two date range input fields at the __main window__ at each program start-up. A pop-up window is presented containing two input fields. You can specify the range relative to the current date (at program startup) by supplying the desired number of days to look back in the past and into the future, respectively. A special value -1 means "no limit", ie. the corresponding date input field at the main window will be left blank. Remember to select __save options__ after changing the default date range. The selected date range is then used next time Xfinans is started. :limit trans.list by date:show committed: Limit transaction list by date Show the transactions of the __open__ account within the period given by the __date range__ fields in the __main window__. When this option is NOT selected, the program tries to determine how many transactions will fit in the window, and shows only this many of the most recent (and future) transactions. When you select 'limit transaction list by date', the transaction list contains the transactions within the period given by the __date range__. A scrollbar enables you to navigate if the account contains more transactions in the selected period than the window can hold. If the __date range__ fields are left empty, then all transactions in the account will be shown when 'limit transaction list by date' is selected. __Detail__: The mechanism currently used for determining how many transactions fit in the window is rather primitive; among other things, it depends on a hard-coded font size. The mechanism is known NOT to work on at least one platform :-( and is known to WORK on at least one other platform :-) :show committed:show transaction numbers: Show committed Show the balance calculated from committed transactions. A transaction is committed by clicking the __commit__ button. See '__commit__' for further explanation of the commit concept. 'show committed' shows an additional column in the transaction list. This new rightmost column shows the sum of the committed transactions: Amount Balance Committed Bal. 950301 Initial balance 200.00 200.00 200.00 950314 Salary 300.00 500.00 500.00 950401 Check # 1, new car -200.00 300.00 950414 Salary 300.00 600.00 800.00 In this example, all transactions except the "Check # 1, new car" have been committed. A "hole" in the committed balance column thus indicates an uncommitted transaction. Once the "Check # 1, new car" is marked as committed, the list is updated and the balances become identical: Amount Balance Committed Bal. 950301 Initial balance 200.00 200.00 200.00 950314 Salary 300.00 500.00 500.00 950401 Check # 1, new car -200.00 300.00 300.00 950414 Salary 300.00 600.00 600.00 :show transaction numbers:dep./widthdr. in sep. cols.: Show transaction numbers Display the transaction numbers in a column next to the dates in the transaction list. :options:help: Options __limit trans.list by date__ Show transactions within the period given by the __date range__ fields in the __main window__. __show committed__ Show the balance calculated from committed transactions. __show transaction numbers__ Show the transaction numbers in a column next to the dates. __dep./widthdr. in sep. cols.__ Place deposits and withdrawals in separate columns. __date format__ Is in itself a dummy entry: The date format is selected with one of the 'yymmdd' etc. entries following it. __print command__ Pop up a dialog window requesting the command to be used for printing. __PostScript__ Select PostScript(TM) output. __ASCII text__ Select ASCII output. __default date range__ Select the default transaction list __date range__. __number of decimals__ Select the currency output format. __save options__ Save the current configuration as the default for future sessions. :dep./widthdr. in sep. cols.:date format: Dep./widthdr. in sep. cols. Place deposits and withdrawals in separate columns, instead of the default one-column layout. :date format:print command: Date format The supported date formats are shown in the __options__ menu, following the 'date format:' entry. Most of these are predefined formats, but the entry __user defined__ allows you to define your own format. The selected date format determines both the format in which dates are displayed, and the expected format for dates entered by the user. So you must remember to use the date format you select :-) In most cases, Xfinans accepts malformed dates simply as dates with strange values, like year zero. A warning message is printed about strange date values, though, so you can correct the date later, if required (for instance by editing the transaction). :user defined:date format: User defined When this date format is selected, a dialog window pops up requesting a format string. This is a format string as used by the the C language "printf" function. The format string should contain three "%d" format specifiers, for the year, month, and day, respectively. You can insert your favorite separating characters (or spaces) between the "%d" specifiers. Note that the format string must allow unambiguous parsing of input dates. The order of year, month, and day is selected on the "order" menu on the dialog window, where you can also select either 2- or 4-digit year format. :print command:PostScript: Print command Pop up a dialog window requesting the command to be used for printing. The default print command is "lpr -Plp". :PostScript:ASCII text: PostScript Generate PostScript(TM) output with the __print__ feature. You may want to specify the name of your PostScript printer as part of the __print command__ when selecting PostScript output. :ASCII text:default date range: ASCII text Generate ASCII text output with the __print__ feature. The output line width is set to 80 characters. This output format is suitable for most line-oriented printers. You may want to specify the name of your line printer as part of the __print command__ when selecting ASCII text output. :number of decimals:save options: Number of decimals Pops up a dialog window where you can specify the desired number of decimals on currency amounts. :save options:options: Save options Saves the current configuration in the file "xfinans.cnf". The configuration is loaded automatically in future Xfinans sessions initiated in the same working directory. :help:transaction functions: Help Pops up the help window, displaying this text. Hypertext structure enables you to __navigate__ in the help text. :author:copyright-stuff: 3. Contacting the author Xfinans is written by Niels C. Larsen (lupus@iesd.auc.dk). __credits__ I would like to hear from the users of Xfinans. Comments and suggestions are welcome; or just say "hi" if you find the program useful. Also tell me if you are having trouble with compiling or running the program - I will then try to improve its portability, but give no promise for success! The above Internet e-mail address is valid at least until December 31 1996. After this date, mail will probably be forwarded to my new address, so it should continue to work for some time. If you have access to the World Wide Web, then you can check out the Xfinans homepage which contains the most recent info about new releases etc.: http://www.iesd.auc.dk/~lupus/xfinans.html You may also write to me using paper mail, my address is then: Niels C. Larsen Enghavevej 12 st.th. 7430 Ikast DENMARK :copyright-stuff:Revision history: COPYRIGHT (C) 1995-1996 Niels C. Larsen (__author__) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. The full text of the GNU General Public License is included in the file __GNU_GPL__. :GNU_GPL:copyright-stuff: GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. __contents__ :index:contents: 6. Index of functions __ASCII text__ Select ASCII text output for printing (__options__) __categories__ Main page for the category concept and mechanisms (__misc__) __commit__ Commit/uncommit the selected transaction (__transaction functions__) __create__ Create a new account (__account functions__) __default date range__ Select the default transaction list __date range__ (__options__) __delete__ Delete the selected account (__account functions__) __delete __ Delete the selected transaction (__transaction functions__) __edit__ Edit the selected transaction (__transaction functions__) __help__ Pop up this window (__transaction functions__) __interest__ Calculate interest for the open account (__misc__ ) __limit trans.list by date__ Show the transactions within the given __date range__ (__options__) __list balances__ List the current balances of a set of accounts (__misc__) __misc__ Activates a pop-up menu with various extra functions (__transaction functions__) __new__ Enter a new transaction to the open account (__transaction functions__) __number of decimals__ Configure the currency output format (__options__) __open__ Open one of the accounts shown in the account list (__account functions__) __options__ Activates a configuration pop-up menu (__transaction functions__) __plot__ Plot the balance of the open account (__misc__) __PostScript__ Select PostScript(TM) output for printing. (__options__) __print__ Print the transactions of the open account (__misc__) __print command__ Select the command used for printing (__options__) __quit__ Exit Xfinans (__account functions__) __recurring__ Create/edit/delete recurring transactions (__misc__) __search__ Search the transactions of the open account for a specified substring and/or sort the transactions (__misc__) __show committed__ Show the balance calculated from committed transactions (__options__) __show transaction numbers__ Display transaction numbers in the transaction list (__options__) __transfer__ Transfer an amount from one account to another (__account functions__) :file not found:necessary support files: File not found. Check the working directory of Xfinans; are the __necessary support files__ present? Otherwise copy them from the distribution. You can set the Xfinans working directory by using __Environment variables__ :necessary support files:contents: The following more or less necessary support files should be present in the Xfinans working directory: hyperhelp (help file - this text) hyperhelp.index finans.bkd (account data base) xfin.ps (PostScript-header file) categories (category database) variables (user defined variables and routines for the category definitions) category_engine (Perl category engine) check.acc (demo account) giro.acc ( --- ) savings.acc ( --- ) If some of these are missing, you can copy them form the distribution. The demo accounts can be deleted once you __create__ your own account files. :max accounts:contents: Internal limit reached. You can change the #define MAX_KONTI definition in 'xfinans.h' and recompile, if you need more accounts. :can't create:contents: The transaction file cannot be created. Check the filename and permissions on the working directory. :can't update:contents: The transaction file cannot be updated. Check the permissions on Xfinans's working directory. :can't write:contents: Cannot write file. Check the permissions on the working directory. :can't plot:plot: This account cannot be plotted in the current version. Only "ordinary" accounts can plotted. :no gnuplot:plot: The plot functions depends on the program "Gnuplot". Check your PATH if Gnuplot is installed but still refuses to work. :max transactions:contents: This account has reached the internal limit of number of transactions per account. You can carry on, since most functions (but not all) will still work correctly, and the program will not break down. However, you should consider creating a new account, e.g. with the same name and account number as the current, but with new file under a different file name, and add future transactions to this file. You could also increase the internal limit, which is the in "xfinans.h", and recompile. But the internal data structures and algorithms are not very efficient for long transaction lists anyway. :bad date:new: The date is invalid. Be sure to enter dates in the date format selected on the __options__ menu. :no PS header:print: The PostScript header file 'xfin.ps' not found. Check that the file exists in the working directory, and is readable. Copy the file from the Xfinans distribution if required. For a list of files that should be present in the Xfinans working directory, see __necessary support files__. :do select:contents: This operation requires that you __open__ an account first. :can't print:print: This account cannot be printed in the current version. Only "ordinary" accounts can printed. :navigate:home: There are various ways to navigate in the hypertext: 1) Follow a link by clicking your left mouse button between a pair of double underscores 2) Use the __home__, __back__, and __next__ buttons :home:back: The 'home' button takes you to the "root" node of the hypertext, which is the "Welcome to Xfinans" page also containing a table of contents. :back:next: The 'back' button takes you to the previous page you visisted, if any. The function is based on a stack of pages. Each time you jump to a new page by following a link or by clicking __next__ or __home__, the page you leave is pushed onto this stack. The 'back' function pops and jumps to the top element. :next:contents: Many pages are linked together with a "next"-link which you can follow by pressing the 'next' button. The label next to the 'next' button :-) indicates where you go if you press 'next'. :Revision history:Command line options: 4. Revision history __Program revisions__ __Help file revision__ :Program revisions:Revision history: Some highlights from the evolution of Xfinans: 931231 1.1 Initial version. 940522 2.4 Redesign of the main window, now built with "panes" 940607 2.6 First support for PostScript output 940615 2.8 Search-function 940801 3.0 First help window; contains plain text 940822 3.1 Printer name selectable at run-time Improved PostScript layout 941105 3.3 "Show current balances" added 950101 3.4 Error/warning/help messages shown in a pop-up window 950103 3.5 Plot via Gnuplot 950228 4.0 The 'misc' pop-up menu added 950311 4.2 First public release 950316 4.3 Bug fixes, first announced public release 950331 4.5 Hypertext-help 950414 4.6 Double-click a transaction to edit it; environment variable XFINANSDIR sets the working directory; transfer works "correctly", also when given a text. 950429 4.7 Average balance can be displayed on plots 950529 4.9 Commit support now enabled in the official release. Options menu for selecting date format etc. 950609 5.1 Header line naming the columns of the transaction list User defined date format Selectable currency format (number of decimals) 950705 5.3 4 digit years in the native date format. Repeat-period on transactions. Transaction numbers. Keyboard controlable input focus 960114 5.8 Recurring transactions. Categories. 960706 5.9 Transaction list date range limit. :Command line options:Environment variables: Command line options Xfinans understands the standard X Toolkit options. No application-specific options are used. :Environment variables:index: Environment variables XFINANSDIR The directory where the Xfinans data-files are kept. If XFINANSDIR isn't set, Xfinans assumes that they are found in it's current working directory. For a list of files that should be present in XFINANSDIR or the current working directory, see __necessary support files__. XFINANSFOCUS Selects method for moving input focus between input fields. If set to "keyboard", then the input focus is controlled from the keyboard. Otherwise (the default), the input focus follows the mouse pointer. See __input focus__ for details. :strange date:date format: "Strange" date value A user-supplied date has a strange value (such as month<1 or month>12, day<1 or day>31). The date will be accepted by Xfinans, but you may want to correct it anyway. The cause of a strange date value may be that the date was entered in another format than the one selected on the __options__ menu, see also __date format__. To correct a strange date in the transaction list, you may have to clear the __date range__ fields and select __limit trans.list by date__ on the __options__ menu, because the transaction could be inserted at the top of the list rather than where it was intended (due to the strange date value). When you find the transaction, simply __edit__ it as usual. In special cases, it may not be possible to correct the date before the operation using it proceeds -- for instance when it is a start date given for a print-out. The result is that all transactions will be printed. Bad luck. :-) :credits:author: Numerous people have contributed with useful suggestions for improving Xfinans. Thanks to them. Listed below are only the people who have contributed with actual source code that has become part of the Xfinans distribution: Steven Lembark: The new generation of date handling functions. Walter Obermiller: The new PostScript header-file. Rick Scott: Recurring transactions.