Merge commit 'dbfbf2bc893de3c44dcc08c33811bc274f647672'

This commit is contained in:
Craig Earls 2014-05-09 20:40:42 -07:00
commit 20b915668f
15 changed files with 316 additions and 63 deletions

View file

@ -5,7 +5,7 @@ PROJECT(ledger)
set(Ledger_VERSION_MAJOR 3)
set(Ledger_VERSION_MINOR 0)
set(Ledger_VERSION_PATCH 2)
set(Ledger_VERSION_DATE 20140417)
set(Ledger_VERSION_DATE 20140507)
enable_testing()
@ -20,7 +20,7 @@ option(DISABLE_ASSERTS "Build without any internal consistency checks" OFF)
option(BUILD_DEBUG "Build support for runtime debugging" OFF)
option(BUILD_LIBRARY "Build and install Ledger as a library" ON)
option(BUILD_DOCS "Build and install documentation" ON)
option(BUILD_DOCS "Build and install documentation" OFF)
option(BUILD_WEB_DOCS "Build version of documentation suitable for viewing online" OFF)
option(BUILD_EMACSLISP "Build and install ledger-mode for Emacs" OFF)

5
acprep
View file

@ -875,6 +875,9 @@ class PrepareBuild(CommandLineApp):
if self.options.boost_include:
conf_args.append('-DBOOST_INCLUDEDIR=%s' %
self.options.boost_include)
if self.options.build_dir:
conf_args.append('-DBUILD_DIR=%s' %
self.options.build_dir)
if self.prefix_directory():
conf_args.append('-DCMAKE_INSTALL_PREFIX=%s' % self.prefix_directory())
@ -942,7 +945,7 @@ class PrepareBuild(CommandLineApp):
make_args.append('-j%d' % self.options.jobs)
if self.options.verbose:
make_args.append('VERBOSE=1')
make_args.append('-v' if self.options.use_ninja else 'VERBOSE=1')
self.log.debug('Configure arguments => ' + str(config_args))
self.log.debug('Makefile arguments => ' + str(make_args))

View file

@ -0,0 +1,54 @@
#!/bin/sh
# iso4217ledger.sh - Convert ISO 4217 currencies to ledger commodities
#
# This script will download the latest XML for ISO 4217 Table A.1
# and print the contained currency & funds code list as ledger
# commodity definitions to stdout.
# Copyright (c) 2014 Alexis Hildebrandt
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
xml_url="http://www.currency-iso.org/dam/downloads/table_a1.xml"
xsl_file="$(dirname $0)/iso4217ledger.xsl"
xsltproc="$(which xsltproc)"
if [ ! -f "$xsltproc" -o ! -x "$xsltproc" ]; then
echo "Can't find xsltproc"
exit 1
fi
download_command="$(which curl)"
if [ -f "$download_command" \
-a -x "$download_command" ]; then
download_options="--silent"
else
download_command="$(which wget)"
if [ -n "$download_command" \
-a -f "$download_command" \
-a -x "$download_command" ]; then
download_options="--quiet --output-document -"
else
echo "Can't find curl or wget."
exit 1
fi
fi
$download_command $download_options "$xml_url" | $xsltproc "$xsl_file" -

View file

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
! iso4217ledger.xsl - Transform ISO 4217 Table A.1 to ledger commodities
!
! The current currency & funds code list is found at:
! http://www.currency-iso.org/en/home/tables/table-a1.html
! -->
<!--
! Copyright (c) 2014 Alexis Hildebrandt
!
! Permission is hereby granted, free of charge, to any person obtaining a copy
! of this software and associated documentation files (the "Software"), to deal
! in the Software without restriction, including without limitation the rights
! to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
! copies of the Software, and to permit persons to whom the Software is
! furnished to do so, subject to the following conditions:
!
! The above copyright notice and this permission notice shall be included in
! all copies or substantial portions of the Software.
!
! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
! IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
! AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
! LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
! OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
! SOFTWARE.
! -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<!--
! Set the value of this variable to your preferred decimal separator.
! For European countries this is likely to be the comma ','.
! -->
<xsl:variable name="decimal_separator">
<xsl:text>,</xsl:text>
<!--
<xsl:text>.</xsl:text>
-->
</xsl:variable>
<!--
! Ensure that plain text will be written,
! and all whitespace from the XML source is stripped.
! -->
<xsl:output method="text"/>
<xsl:template match="text()" />
<!--
! Add comment that the file was generated.
! -->
<xsl:template match="/">
<xsl:text>; Ledger commodity declarations
; Generated from ISO 4217 Table A.1 XML (</xsl:text>
<xsl:value-of select="ISO_4217/@Pblshd"/>
<xsl:text>) using iso4217ledger.xsl
</xsl:text>
<xsl:apply-templates />
</xsl:template>
<!--
! Create ledger entry for the corresponding commodity
! -->
<xsl:template match="CcyNtry">
<xsl:variable name="ccy">
<xsl:choose>
<xsl:when test="Ccy">
<xsl:value-of select="Ccy"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>¤</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:text>commodity </xsl:text>
<xsl:value-of select="$ccy"/>
<xsl:text>
note </xsl:text>
<xsl:value-of select="CcyNm"/>
<xsl:text> - </xsl:text>
<xsl:value-of select="normalize-space(CtryNm)"/>
<xsl:if test="CcyNbr">
<xsl:text> (</xsl:text>
<xsl:value-of select="CcyNbr"/>
<xsl:text>)</xsl:text>
</xsl:if>
<xsl:text>
format </xsl:text>
<xsl:value-of select="$ccy"/><xsl:text> </xsl:text>
<xsl:text>0000</xsl:text>
<xsl:choose>
<xsl:when test="CcyMnrUnts > 0">
<xsl:value-of select="$decimal_separator"/>
<xsl:call-template name="zero">
<xsl:with-param name="count" select="CcyMnrUnts"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="CcyMnrUnts = 'N.A.'">
<xsl:value-of select="$decimal_separator"/>
<xsl:call-template name="zero">
<xsl:with-param name="count" select="3"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
<xsl:text>
nomarket
</xsl:text>
</xsl:template>
<!--
! Recursive template to generate 0s
! -->
<xsl:template name="zero">
<xsl:param name="count" select="0"/>
<xsl:if test="$count > 0">
<xsl:text>0</xsl:text>
<xsl:call-template name="zero">
<xsl:with-param name="count" select="$count - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

View file

@ -2,7 +2,7 @@
, texinfo, gnused }:
let
rev = "20140417";
rev = "20140507";
in
stdenv.mkDerivation {

View file

@ -36,17 +36,29 @@ set(info_files ledger3.texi ledger-mode.texi)
find_program(MAKEINFO makeinfo)
find_program(TEXI2PDF texi2pdf)
find_program(TEX tex)
find_program(MAN2HTML man2html)
find_program(GROFF groff)
########################################################################
foreach(file ${info_files})
get_filename_component(file_base ${file} NAME_WE)
if(NOT MAKEINFO)
message(WARNING "Could not find makeinfo. Info version of documentation cannot be built.")
else()
add_custom_command(OUTPUT ${file_base}.info
COMMAND makeinfo --force --no-split -o ${file_base}.info ${CMAKE_CURRENT_SOURCE_DIR}/${file}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file}
VERBATIM)
list(APPEND ledger_doc_files ${file_base}.info)
endif()
if(BUILD_WEB_DOCS)
if(NOT MAKEINFO)
message(FATAL_ERROR "Could not find makeinfo. HTML version of documentation cannot be built.")
message(WARNING "Could not find makeinfo. HTML version of documentation cannot be built.")
endif()
add_custom_command(OUTPUT ${file_base}.html
COMMAND makeinfo --force --html --no-split -o ${file_base}.html ${CMAKE_CURRENT_SOURCE_DIR}/${file}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file}
@ -54,11 +66,14 @@ foreach(file ${info_files})
list(APPEND ledger_doc_files ${file_base}.html)
endif(BUILD_WEB_DOCS)
if(NOT TEXI2PDF)
message(WARNING "Could not find texi2pdf. PDF version of documentation will not be built.")
if(NOT TEXI2PDF OR NOT TEX)
message(WARNING "Could not find texi2pdf or tex. PDF version of documentation will not be built.")
else()
if(BUILD_A4_PDF)
set(papersize --texinfo=@afourpaper)
endif()
add_custom_command(OUTPUT ${file_base}.pdf
COMMAND texi2pdf -b -q -o ${file_base}.pdf ${CMAKE_CURRENT_SOURCE_DIR}/${file}
COMMAND texi2pdf ${papersize} -b -q -o ${file_base}.pdf ${CMAKE_CURRENT_SOURCE_DIR}/${file}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file}
VERBATIM)
list(APPEND ledger_doc_files ${file_base}.pdf)
@ -72,15 +87,21 @@ if(BUILD_WEB_DOCS)
if(NOT BASH)
message(FATAL_ERROR "Could not find bash. Unable to build documentation.")
endif()
if(NOT MAN2HTML)
message(FATAL_ERROR "Could not find man2html. HTML version of man page cannot be built.")
if(MAN2HTML)
add_custom_command(OUTPUT ledger.1.html
COMMAND ${BASH} -c "man2html ${CMAKE_CURRENT_SOURCE_DIR}/ledger.1 | tail -n+3 > ledger.1.html"
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/ledger.1
VERBATIM)
list(APPEND ledger_doc_files ledger.1.html)
elseif(GROFF)
add_custom_command(OUTPUT ledger.1.html
COMMAND ${BASH} -c "groff -mandoc -Thtml ${CMAKE_CURRENT_SOURCE_DIR}/ledger.1 > ledger.1.html"
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/ledger.1
VERBATIM)
list(APPEND ledger_doc_files ledger.1.html)
else()
message(FATAL_ERROR "Could not find man2html or groff. HTML version of man page cannot be built.")
endif()
add_custom_command(OUTPUT ledger.1.html
COMMAND ${BASH} -c "man2html ${CMAKE_CURRENT_SOURCE_DIR}/ledger.1 | tail -n+3 > ledger.1.html"
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/ledger.1
VERBATIM)
list(APPEND ledger_doc_files ledger.1.html)
endif(BUILD_WEB_DOCS)
########################################################################
@ -99,8 +120,19 @@ endif(CMAKE_INSTALL_MANDIR)
foreach(file ${info_files})
get_filename_component(file_base ${file} NAME_WE)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${file}
if (CMAKE_SOURCE_DIR STREQUAL BUILD_DIR)
set(doc_dir CMAKE_CURRENT_SOURCE_DIR)
else()
get_filename_component(dir_base ${CMAKE_CURRENT_SOURCE_DIR} NAME_WE)
set(doc_dir "${CMAKE_SOURCE_DIR}/${BUILD_DIR}/${dir_base}")
endif()
install(FILES ${doc_dir}/${file_base}.info
DESTINATION ${CMAKE_INSTALL_INFODIR} COMPONENT doc)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${file_base}.pdf
install(FILES ${doc_dir}/${file_base}.pdf
DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT doc OPTIONAL)
if (BUILD_WEB_DOCS)
install(FILES ${doc_dir}/${file_base}.html
DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT doc)
endif(BUILD_WEB_DOCS)
endforeach()

View file

@ -2693,7 +2693,7 @@ doing it.
* Total posting costs::
* Virtual posting costs::
* Commodity prices::
* Prices vs. costs::
* Prices versus costs::
* Fixated prices and costs::
* Lot dates::
* Lot notes::
@ -3296,7 +3296,7 @@ happening in the case of an exceptional transaction, surround the
Income:Gifts Received
@end smallexample
@node Commodity prices, Prices vs. costs, Virtual posting costs, Transactions
@node Commodity prices, Prices versus costs, Virtual posting costs, Transactions
@section Commodity prices
@findex --lot-prices
@ -3424,8 +3424,8 @@ And in cases where the amounts do not divide into whole figures and
must be rounded, the capital gains figure could be off by a cent. Use
with caution.
@node Prices vs. costs, Fixated prices and costs, Commodity prices, Transactions
@section Prices vs. costs
@node Prices versus costs, Fixated prices and costs, Commodity prices, Transactions
@section Prices versus costs
Because lot pricing provides enough information to infer the cost, the
following two transactions are equivalent:
@ -3445,7 +3445,7 @@ example in the print report. Functionally, however, there is no
difference, and neither the register nor the balance report are
sensitive to this difference.
@node Fixated prices and costs, Lot dates, Prices vs. costs, Transactions
@node Fixated prices and costs, Lot dates, Prices versus costs, Transactions
@section Fixated prices and costs
If you buy a stock last year, and ask for its value today, Ledger will
@ -3476,7 +3476,7 @@ fixated prices by way of the cost:
@end smallexample
This is the same as the previous transaction, with the same caveats
found in @ref{Prices vs. costs}.
found in @ref{Prices versus costs}.
@node Lot dates, Lot notes, Fixated prices and costs, Transactions
@section Lot dates
@ -8458,13 +8458,13 @@ make sense later.
@menu
* Basic data traversal::
* Raw vs. Cooked::
* Raw versus Cooked::
* Queries::
* Embedded Python::
* Amounts::
@end menu
@node Basic data traversal, Raw vs. Cooked, Extending with Python, Extending with Python
@node Basic data traversal, Raw versus Cooked, Extending with Python, Extending with Python
@section Basic data traversal
Every interaction with Ledger happens in the context of a Session.
@ -8491,8 +8491,8 @@ for xact in ledger.read_journal("sample.dat").xacts:
print "Transferring %s to/from %s" % (post.amount, post.account)
@end smallexample
@node Raw vs. Cooked, Queries, Basic data traversal, Extending with Python
@section Raw vs. Cooked
@node Raw versus Cooked, Queries, Basic data traversal, Extending with Python
@section Raw versus Cooked
Ledger data exists in one of two forms: raw and cooked. Raw objects are
what you get from a traversal like the above, and represent exactly what
@ -8556,7 +8556,7 @@ does it transaction-wise. It relies on the fact that an unsorted report
returns postings in the exact order they were parsed from the journal
file.
@node Queries, Embedded Python, Raw vs. Cooked, Extending with Python
@node Queries, Embedded Python, Raw versus Cooked, Extending with Python
@section Queries
The Journal.query() method accepts every argument you can specify on the

View file

@ -42,43 +42,28 @@
(defconst ledger-code-string "\\((.*)\\)?")
(defconst ledger-payee-string "\\(.*\\)")
(defmacro ledger-line-regex (&rest elements)
(let (regex-string)
(concat (dolist (e elements regex-string)
(setq regex-string
(concat regex-string
(eval
(intern
(concat "ledger-" (symbol-name e) "-string")))))) "[ \t]*$")))
(defun ledger-get-regex-str (name)
(symbol-value (intern (concat "ledger-" (symbol-name name) "-string"))))
(defmacro ledger-single-line-config2 (&rest elements)
"Take list of ELEMENTS and return regex and element list for use in context-at-point"
(let (regex-string)
`'(,(concat (dolist (e elements regex-string)
(setq regex-string
(concat regex-string
(eval
(intern
(concat "ledger-" (symbol-name e) "-string")))))) "[ \t]*$")
,elements)))
(defun ledger-line-regex (elements)
(concat (apply 'concat (mapcar 'ledger-get-regex-str elements)) "[ \t]*$"))
(defmacro ledger-single-line-config (&rest elements)
"Take list of ELEMENTS and return regex and element list for use in context-at-point"
`'(,(eval `(ledger-line-regex ,@elements))
,elements))
`(list (ledger-line-regex (quote ,elements)) (quote ,elements)))
(defconst ledger-line-config
(list (list 'xact (list (ledger-single-line-config date nil status nil code nil payee nil comment)
(ledger-single-line-config date nil status nil code nil payee)
(ledger-single-line-config date nil status nil payee)))
(list 'acct-transaction (list (ledger-single-line-config indent comment)
(ledger-single-line-config2 indent status account nil commodity amount nil comment)
(ledger-single-line-config2 indent status account nil commodity amount)
(ledger-single-line-config2 indent status account nil amount nil commodity comment)
(ledger-single-line-config2 indent status account nil amount nil commodity)
(ledger-single-line-config2 indent status account nil amount)
(ledger-single-line-config2 indent status account nil comment)
(ledger-single-line-config2 indent status account)))))
(ledger-single-line-config indent status account nil commodity amount nil comment)
(ledger-single-line-config indent status account nil commodity amount)
(ledger-single-line-config indent status account nil amount nil commodity comment)
(ledger-single-line-config indent status account nil amount nil commodity)
(ledger-single-line-config indent status account nil amount)
(ledger-single-line-config indent status account nil comment)
(ledger-single-line-config indent status account)))))
(defun ledger-extract-context-info (line-type pos)
"Get context info for current line with LINE-TYPE.

View file

@ -167,6 +167,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug")
if(BUILD_LIBRARY)
list(APPEND _args ${CMAKE_SHARED_LIBRARY_CXX_FLAGS})
endif()
list(APPEND _args "-std=c++11 ")
list(APPEND _args "-x c++-header " ${_inc})
list(APPEND _args -c ${_header_filename} -o ${_pch_filename})
@ -185,7 +186,6 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug")
elseif(CMAKE_CXX_COMPILER MATCHES "g\\+\\+")
set(GXX_WARNING_FLAGS
-ansi
-pedantic
-Wall
-Winvalid-pch
@ -223,6 +223,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug")
list(APPEND _args ${CMAKE_SHARED_LIBRARY_CXX_FLAGS})
endif()
list(APPEND _args ${GXX_WARNING_FLAGS})
list(APPEND _args "-std=c++11 ")
list(APPEND _args "-x c++-header " ${_inc})
list(APPEND _args -c ${_header_filename} -o ${_gch_filename})

View file

@ -267,7 +267,8 @@ commodity_pool_t::exchange(const amount_t& amount,
// Do not record commodity exchanges where amount's commodity has a
// fixated price, since this does not establish a market value for the
// base commodity.
if (! per_unit_cost.is_realzero() &&
if (add_price &&
! per_unit_cost.is_realzero() &&
(current_annotation == NULL ||
! (current_annotation->price &&
current_annotation->has_flags(ANNOTATION_PRICE_FIXATED))) &&

View file

@ -302,6 +302,7 @@ public:
HANDLER(market).report(out);
HANDLER(meta_).report(out);
HANDLER(monthly).report(out);
HANDLER(no_pager).report(out);
HANDLER(no_rounding).report(out);
HANDLER(no_titles).report(out);
HANDLER(no_total).report(out);

View file

@ -229,7 +229,11 @@ static void trace_delete_func(void * ptr, const char * which)
//#if !defined(__has_feature) || !__has_feature(address_sanitizer)
#ifdef _GLIBCXX_THROW
void * operator new(std::size_t size) _GLIBCXX_THROW(std::bad_alloc) {
#else
void * operator new(std::size_t size) throw (std::bad_alloc) {
#endif
void * ptr = std::malloc(size);
if (DO_VERIFY() && ledger::memory_tracing_active)
ledger::trace_new_func(ptr, "new", size);
@ -241,7 +245,11 @@ void * operator new(std::size_t size, const std::nothrow_t&) throw() {
ledger::trace_new_func(ptr, "new", size);
return ptr;
}
#ifdef _GLIBCXX_THROW
void * operator new[](std::size_t size) _GLIBCXX_THROW(std::bad_alloc) {
#else
void * operator new[](std::size_t size) throw (std::bad_alloc) {
#endif
void * ptr = std::malloc(size);
if (DO_VERIFY() && ledger::memory_tracing_active)
ledger::trace_new_func(ptr, "new[]", size);

View file

@ -292,9 +292,9 @@ bool xact_base_t::finalize()
_("A posting's cost must be of a different commodity than its amount"));
cost_breakdown_t breakdown =
commodity_pool_t::current_pool->exchange
(post->amount, *post->cost, false, ! post->has_flags(POST_COST_VIRTUAL),
datetime_t(date(), time_duration(0, 0, 0, 0)));
commodity_pool_t::current_pool->exchange(
post->amount, *post->cost, false, ! post->has_flags(POST_COST_VIRTUAL),
datetime_t(date(), time_duration(0, 0, 0, 0)));
if (post->amount.has_annotation() && post->amount.annotation().price) {
if (breakdown.basis_cost.commodity() == breakdown.final_cost.commodity()) {

6
test/regress/999.test Normal file
View file

@ -0,0 +1,6 @@
2012-03-10 My Brother
Assets:Brokerage 1000 AAPL (@) $1
Income:Gifts Received
test prices
end test

View file

@ -1,5 +1,29 @@
#!/bin/bash
# By default US Letter is used as the PDF papersize.
# For those preferring other dimensions add a4 or small
# as a commandline argument to this script to create a
# DIN A4 or smallbook version of the PDF.
case $1 in
a4*|afour*)
papersize='--texinfo=@afourpaper';;
small*)
papersize='--texinfo=@smallbook';;
*)
papersize='';; # US Letter is texinfo default
esac
# Use keg-only Mac Hombrew texinfo if installed.
# Since texi2pdf is a shell script itself executing texi2dvi
# PATH is prepended with the path to correct texinfo scripts.
if [ $(uname -s) = 'Darwin' ]; then
brew list texinfo >/dev/null 2>&1 \
&& export PATH="$(brew --prefix texinfo)/bin:$PATH"
fi
echo "===================================== Making Info..."
makeinfo ledger3.texi
echo "===================================== Making HTML..."
makeinfo --html --no-split ledger3.texi
echo "===================================== Making PDF..."
texi2pdf --quiet --batch ledger3.texi
texi2pdf --quiet --batch ${papersize} ledger3.texi