diff options
author | Craig Earls <enderw88@gmail.com> | 2011-10-29 11:46:16 -0700 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2012-02-10 09:11:04 -1000 |
commit | 6e343da59f1daea2e111c2779e3f528499fe09e1 (patch) | |
tree | 0f79b8c7bca26dffb441c034d26984a2068ada92 /doc/ledger3.texi | |
parent | 35302208e719a4ab7cc857b6d5057c317db73e10 (diff) | |
download | fork-ledger-6e343da59f1daea2e111c2779e3f528499fe09e1.tar.gz fork-ledger-6e343da59f1daea2e111c2779e3f528499fe09e1.tar.bz2 fork-ledger-6e343da59f1daea2e111c2779e3f528499fe09e1.zip |
Added org mode tutorial from Eric
Diffstat (limited to 'doc/ledger3.texi')
-rw-r--r-- | doc/ledger3.texi | 308 |
1 files changed, 307 insertions, 1 deletions
diff --git a/doc/ledger3.texi b/doc/ledger3.texi index 3eb913c6..d41df108 100644 --- a/doc/ledger3.texi +++ b/doc/ledger3.texi @@ -45,7 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @titlepage @title Ledger: Command-Line Accounting @subtitle For Version 3.0 of Ledger -@subtitle Draft Manual Time-stamp: <2011-10-27 21:55 (cpearls)> +@subtitle Draft Manual Time-stamp: <2011-10-29 11:28 (cpearls)> @author John Wiegley @end titlepage @@ -3143,6 +3143,312 @@ The @code{org} command produces a journal file suitable for use in the emacs org mode. More details on using org mode can be found at @url{http://www.orgmode.org}. +Org mode has a sub-system known as babel which allows for literate +programming. This allows you to mix text and code within the same +document and automatically execute code which may generate results which +will then appear in the text. + +One of the languages supported by org+babel is ledger so that you can +have ledger commands embedded in a text file and have the output of +ledger commands also appear in the text file. The output can be +updated whenever any new ledger entries are added. + +For instance, the following org mode text document snippet illustrates a +very naive but still useful of the org+babel system: + +@smallexample +* A simple test of ledger in an org file +The following are some entries and I have requested that ledger be run +to generate a balance on the accounts. I could have asked for a +register or, in fact, anything at all the ledger can do through command +line options. + +#+begin_src ledger :cmdline -s bal :results value +2010/01/01 * Starting balance + assets:bank:savings £1300.00 + income:starting balances +2010/07/22 * Got paid + assets:bank:chequing £1000.00 + income:salary +2010/07/23 Rent + expenses:rent £500.00 + assets:bank:chequing +#+end_src + +#+results: +: £1800.00 assets:bank +: £500.00 chequing +: £1300.00 savings +: £500.00 expenses:rent +: £-2300.00 income +: £-1000.00 salary +: £-1300.00 starting balances +@end smallexample + +Typing @command{C-c C-c} anywhere in the ``ledger source code block'' +will invoke ledger on the contents of that block and generate a +``results'' block. The results block can appear anywhere in the file +but, by default, will appear immediately below the source code block. + +You can combine multiple source code blocks before executing ledger and +do all kinds of other wonderful things with Babel (and org). + + +@subsubsection Using Ledger for Accounting in Org-mode with Babel + +Using Babel, it is possible to record financial transactions +conveniently in an org file and subsequently generate the financial +reports required. + +@unnumberedsubsubsec Getting Started + +With a recent version of org (7.01+), Ledger support is provided. To use +it, enable Ledger support. Check the Babel documentation on Worg for +instructions on how to achieve this but I currently do this directly as +follows: +@smallexample +(org-babel-do-load-languages + 'org-babel-load-languages + '((ledger . t) ;this is the important one for this tutorial + )) +@end smallexample +Once Ledger support in Babel has been enabled, we can use proceed to +include Ledger entries within an org file. There are three ways (at +least) in which these can be included: + +@enumerate +@item + place all Ledger entries within one source block and execute + this block with different arguments to generate the appropriate + reports; +@item + place Ledger entries in more than one source block and use the + noweb literary programming approach, supported by babel, to + combine these into one block elsewhere in the file for + processing by Ledger; and, +@item + place Ledger entries in different source blocks and use + tangling to generate a Ledger file which you can subsequently + process using Ledger directly. +@end enumerate + +The first two are described in more detail in this short tutorial. + +@unnumberedsubsubsec Embedded Ledger example with single source block + +The easiest, albeit possibly less useful, way in which to use Ledger +within an org file is to use a single source block to record all Ledger +entries. The following is an example source block: +@smallexample +#+srcname: allinone +#+begin_src ledger +2010/01/01 * Starting balance + assets:bank:savings £1300.00 + income:starting balances +2010/07/22 * Got paid + assets:bank:chequing £1000.00 + income:salary +2010/07/23 Rent + expenses:rent £500.00 + assets:bank:chequing +2010/07/24 Food + expenses:food £150.00 + assets:bank:chequing +2010/07/31 * Interest on bank savings + assets:bank:savings £3.53 + income:interest +2010/07/31 * Transfer savings + assets:bank:savings £250.00 + assets:bank:chequing +2010/08/01 got paid again + assets:bank:chequing £1000.00 + income:salary +#+end_src +@end smallexample +In this example, we have combined both expenses and income into one set +of Ledger entries. We can now generate register and balance reports (as +well as many other types of reports) using babel to invoke Ledger with +specific arguments. The arguments are passed to Ledger using the +:cmdline header argument. In the code block above, there is no such +argument so the system takes the default. For Ledger code blocks, the +default :cmdline argument is bal and the result of evaluating this code +block (@command{C-c C-c}) would be: +@smallexample +#+results: allinone() +: £2653.53 assets +: £650.00 expenses +: £-3303.53 income +@end smallexample +If, instead, you wished to generate a register of all the transactions, +you would change the #+begin_src line for the code block to include the +required command line option: +@smallexample +#+begin_src ledger :cmdline reg +@end smallexample +Evaluating the code block again would generate a different report. + +Having to change the actual directive on the code block and re-evaluate +makes it difficult to have more than one view of your transactions and +financial state. Eventually, babel will support passing arguments to +#+call evaluations of code blocks but this support is missing +currently. Instead, we can use the concepts of literary programming, as +implemented by the noweb features of babel, to help us. + +@unnumberedsubsubsec Multiple Ledger source blocks with noweb + +The noweb feature of babel allows us to expand references to other code +blocks within a code block. For Ledger, this can be used to group +transactions according to type, say, and then bring various sets of +transactions together to generate reports. + +Using the same transactions used above, we could consider splitting +these into expenses and income, as follows: +@unnumberedsubsubsec Income Entries + +The first set of entries relates to income, either monthly pay or +interest, all typically going into one of my bank accounts. Here, I have +placed several entries, but we could have had each entry in a separate +src block. Note that all code blocks you wish to refer to later must +have the :noweb yes babel header argument specified. +@smallexample +#+srcname: income +#+begin_src ledger :noweb yes +2010/01/01 * Starting balance + assets:bank:savings £1300.00 + income:starting balances +2010/07/22 * Got paid + assets:bank:chequing £1000.00 + income:salary +2010/07/31 * Interest on bank savings + assets:bank:savings £3.53 + income:interest +2010/07/31 * Transfer savings + assets:bank:savings £250.00 + assets:bank:chequing +2010/08/01 got paid again + assets:bank:chequing £1000.00 + income:salary +#+end_src +@end smallexample +@unnumberedsubsubsec Expenses + +The following entries relate to personal expenses, such as rent and +food. Again, these have all been placed in a single src block but could +have been done individually. +@smallexample +#+srcname: expenses +#+begin_src ledger :noweb yes +2010/07/23 Rent + expenses:rent £500.00 + assets:bank:chequing +2010/07/24 Food + expenses:food £150.00 + assets:bank:chequing +#+end_src +@end smallexample + +@unnumberedsubsubsec Financial Summaries + +Given the ledger entries defined above in the income and expenses code +blocks, we can now refer to these using the noweb expansion directives, +<<name>>. We can now define different code blocks to generate specific +reports for those transactions. Below are two examples, one to generate +a balance report and one to generate a register report of all +transactions. +@unnumberedsubsubsec An overall balance summary + +The overall balance of your account and expenditure with a breakdown +according to category is specified by passing the :cmdline bal argument +to Ledger. This code block can now be evaluated (C-c C-c) and the +results generated by incorporating the transactions referred to by the +<<income>> and <<expenses>>= lines. +@smallexample +#+srcname: balance +#+begin_src ledger :cmdline bal :noweb yes +<<income>> +<<expenses>> +#+end_src + +#+results: balance +: £2653.53 assets +: £650.00 expenses +: £-3303.53 income +@end smallexample + +If you want a more detailed breakdown of where your money is and where +it has been spent, you can specify the -s flag (i.e. :cmdline -s bal) to +tell Ledger to include sub-accounts in the report. + +@smallexample +#+begin_src ledger :cmdline -s bal :noweb yes +<<income>> +<<expenses>> +#+end_src + +#+results: +: £2653.53 assets:bank +: £1100.00 chequing +: £1553.53 savings +: £650.00 expenses +: £150.00 food +: £500.00 rent +: £-3303.53 income +: £-3.53 interest +: £-2000.00 salary +: £-1300.00 starting balances +@end smallexample +@unnumberedsubsubsec Generating a monthly register + +You can also generate a monthly register (the reg command) by executing +the following src block. This presents a summary of transactions for +each monthly period (the -M argument) with a running total in the final +column (which should be 0 at the end if all the entries are correct). + +@smallexample +#+srcname: monthlyregister +#+begin_src ledger :cmdline -M reg :noweb yes +<<income>> +<<expenses>> +#+end_src + +#+results: monthlyregister +:2010/01/01 - 2010/01/31 assets:bank:savings £1300.00 £1300.00 +: in:starting balances £-1300.00 0 +:2010/07/01 - 2010/07/31 assets:bank:chequing £100.00 £100.00 +: assets:bank:savings £253.53 £353.53 +: expenses:food £150.00 £503.53 +: expenses:rent £500.00 £1003.53 +: income:interest £-3.53 £1000.00 +: income:salary £-1000.00 0 +:2010/08/01 - 2010/08/01 assets:bank:chequing £1000.00 £1000.00 +: income:salary £-1000.00 0 +@end smallexample + +We could also generate a monthly report on our assets showing how these +are increasing (or decreasing!). In this case, the final column will be +the running total of the assets in our ledger. + +@smallexample +#+srcname: monthlyassetsregister +#+begin_src ledger :cmdline -M reg assets :noweb yes +<<income>> +<<expenses>> +#+end_src + +#+results: monthlyassetsregister +: 2010/01/01 - 2010/01/31 assets:bank:savings £1300.00 £1300.00 +: 2010/07/01 - 2010/07/31 assets:bank:chequing £100.00 £1400.00 +: assets:bank:savings £253.53 £1653.53 +: 2010/08/01 - 2010/08/01 assets:bank:chequing £1000.00 £2653.53 +@end smallexample + +@unnumberedsubsubsec Summary + +This short tutorial shows how Ledger entries can be embedded in a org +file and manipulated using Babel. However, only simple Ledger features +have been illustrated; please refer to the Ledger documentation for +examples of more complex integrations with a ledger. + @node pricemap, xml, org, Reports in other formats @subsection pricemap |