Motivation
In my thesis, I have a number of citations of a single website
and I don't like to have all of them in the literature (biblatex).
First, I wrote a macro to format those citations uniformly:
% use: \lwn{article-no}{author}{title}{date}
\newcommand{\lwn}[4]{[LWN:#1]\footnote{#2: #3 (#4)
\url{http://lwn.net/Articles/#1}}}
This allows to write:
In the merge window of Linux 3.12, several new features are
planned \lwn{565251}{Jonathan Corbet}{The 3.12 merge window opens}{September 5, 2013}...
This will put a [LWN:565251]
in the text and creates a footnote with the name of the author,
the title, date, and URL.
To create a listing of all such citations in the appendix,
the benefit of creating a macro plays out:
by just changing the macro, it is possible to automatically collect
all citations.
Index
With the \index{}
macro, it is possible to create entries to the *.idx
file.
Those could be postprocessed with a script to generate a piece of LaTeX
that can be included in the document.
But the entries will still occur in the index (or the file must be postprocessed
to remove them).
I used this in a Beamer presentation for a LaTeX tutorial to collect a list of all
packages and all TeXdocs for the handout.
For the Beamer slides, the index was not used otherwise.
\makeindex
\newcommand{\package}[1]{\texttt{#1}\index{package!#1}}
\newcommand{\texdoc}[1]{\textsc{#1}\index{texdoc!#1}}
You can use \package{tikz}, see also \texdoc{latex2e}.
In the Makefile was added:
grep 'package!' slides.idx | sed -e 's/\\indexentry{package!\(.*\)}{.*}/\1/' |sort|uniq > packages.txt
grep 'texdoc!' slides.idx | sed -e 's/\\indexentry{texdoc!\(.*\)}{.*}/\1/' |sort|uniq > texdoc.txt
Writing to files
Latex allows to open a new file and write (or read) to (from) that file.
\newwrite\outputstream
\immediate\openout\outputstream=myfile.tmp
\immediate\write\outputstream{foo 1}
\immediate\write\outputstream{foo 2}
\immediate\write\outputstream{\string\textbf{foo 3}}
\immediate\closeout\outputstream
(Source of that example: Juanjo (latex-community)).
My new macro for the \lwn
citation is now:
% use: \lwn{article-no}{author}{title}{date}
\newcommand{\lwn}[4]{[LWN:#1]\footnote{#2: #3 (#4) \url{http://lwn.net/Articles/#1}}\immediate\write\outputstream{#1;#2;#3;#4}}
% Open file at the begin of the document
\AtBeginDocument{%
\newwrite\outputstream
\immediate\openout\outputstream=lwncite.csv
}
% Close the file at the end of document
\AtEndDocument{%
\immediate\closeout\outputstream
}
The macros \AtBeginDocument
and \AtEndDocument
register those pieces (opening and closing the file)
for the beginning and end of the document.
The file is lwncite.csv
containing lines with article number, author, title, and date,
separated by semicolon.
In the Makefile, this is sorted and reformated:
sort lwncite.csv | awk -F';' '{print "[LWN:" $1 "] -- " $2 ". ``" $3 "''. http://lwn.net/Articles/" $1 " (" $4 ")"}' > lwncite.txt
This will be changed from text format to LaTeX as soon as I integrate the file into my document.
Fix "No room for a new \write
"
If the compilation breaks with the error message "No room for a new \write
",
the maximum number of 16 open files is exceeded. But help is simple:
The Package morewrites
can be loaded at the beginning of the document
(before any other packages). It invades deeply into the guts of LaTeX,
but it has helped me without further problems. Source