![如何自动引入书中的章节标题](https://linux22.com/image/295209/%E5%A6%82%E4%BD%95%E8%87%AA%E5%8A%A8%E5%BC%95%E5%85%A5%E4%B9%A6%E4%B8%AD%E7%9A%84%E7%AB%A0%E8%8A%82%E6%A0%87%E9%A2%98.png)
我正在使用 Spundun 的方法来自动输入日记中的条目,这又受到了 Peter Grill 的启发(使用 LaTeX 记日记),我想按年份添加部分分隔符。这应该可以通过引入带有存在量词的 if-then 子句轻松实现,但我不知道如何做到这一点。
关于目录结构的澄清:该目录的格式为 /Year/Month/Day.tex(例如 2014/Jan/25.tex),每个条目都以 \mytitle{Title} 开头。主 .tex 文件位于 \Year 的父目录中。
我认为可以这样解决:我认为实现我想要的一种方法是引入如下子句:对于每个 /year,如果 /Year/Month 中有一个文件,则输入文件 /Year.tex — 该文件仅包含一行:\section{Year}(例如 \section{2014})。不幸的是,我对 LaTeX 不够熟悉,无法实现该解决方案。
这是我正在使用的代码:
\documentclass{tufte-book}
\usepackage{tikz}
\usepackage{xifthen}
\title{Title}
\author{Author}
\newenvironment{loggentry}[2]%date, heading
{\noindent\textbf{#2}\marginnote{#1}\par}{\vspace{0.5cm}}
\def\?#1{}
\pgfmathtruncatemacro{\StartYear}{2014}
\pgfmathtruncatemacro{\EndYear}{2016}
\newcommand{\writetitle}{0}
\newcommand{\mytitle}[1]
{ \ifthenelse{\writetitle=1}{#1}{}
}
\newread\mysource
\begin{document}
\maketitle
\foreach \Year in {\StartYear,...,\EndYear}
{ \foreach \Month in {Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec}
{ \foreach \Day in {1,...,31}
{ \openin\mysource=\Year/\Month/\Day.tex
\read\mysource to \firstline
\closein\mysource
\xdef\writetitle{1}
\begin{loggentry}{\Year - \Month - \Day}{\firstline}
\xdef\writetitle{0}
\input{\Year/\Month/\Day}
\end{loggentry}
}
{ % files does not exist, so nothing to do
}
}
}
}
\end{document}
我想要的结果如下:
谢谢!
答案1
解决方案的尝试...
我生成了包含 year/month/#day.tex 文件的虚拟目录,只有一个名为的文件#year.tex
,即2014.tex
包含行\section{#year}
等的等,而#day.tex
文件包含\mytitle{Some Stuff}\blindtext
在最内层Foreach
循环中,我\CurrentFileName
使用如上的结构进行定义,并使用\LaTeX
宏\IfFileExists
以确保安全,如果这是真的,则\openin
使用来自 OP 的代码。
OP 澄清了这个问题,即2014.tex
2014 年等中有一个等,其中包含类似 的内容\section{2014}
。只有当 中至少有一个文件时才应包含它2014/{Jan,.....,Dec}
,否则将被删除。我尝试通过状态计数器变量来实现这一点。
\documentclass{tufte-book}
\usepackage{tikz}
\usepackage{blindtext}%
\usepackage{etoolbox}%
\title{Title}
\author{Author}
\newenvironment{loggentry}[2]%date, heading
{\noindent\textbf{#2}\marginnote{#1}\par}{\vspace{0.5cm}}
\def\?#1{}
\pgfmathtruncatemacro{\StartYear}{2014}
\pgfmathtruncatemacro{\EndYear}{2016}
\newcommand{\writetitle}{0}
\newcommand{\mytitle}[1]
{
\ifnumequal{\writetitle}{1}{#1}{}%
}
\newcommand{\InputIfExists}[1]{%
\IfFileExists{#1}{\input{#1}}{}%
}%
\newcounter{includedcntr}
\setcounter{includedcntr}{0}%
\newread\mysource
\begin{document}
\maketitle
\foreach \Year in {\StartYear,...,\EndYear}
{%
\setcounter{includedcntr}{0}% Year file is not included so far
\foreach \Month in {Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec}
{%
\foreach \Day in {1,...,31}
{%
\def\CurrentFileName{\Year/\Month/\Day.tex}%
\IfFileExists{\CurrentFileName}{%
%%% Test if any of the expected day files *.tex exists, if true, then
%%% include the year file and prevent a further inclusion by setting includedcntr to 1
\ifnumequal{\number\value{includedcntr}}{0}{%
\InputIfExists{\Year/\Year.tex}%
\setcounter{includedcntr}{1}}%
{}%
% Now read the title
\openin\mysource=\CurrentFileName%
\read\mysource to \firstline
\closein\mysource
\xdef\writetitle{1}
\begin{loggentry}{\Year - \Month - \Day}{\firstline}
\xdef\writetitle{0}
\input{\CurrentFileName}\par
\end{loggentry}
}{}%
}% Day - foreach
}% Month -foreach
}% Year - foreach
\end{document}%
这是一个小型 Linuxbash
脚本,它在本地目录中生成文件:
#!/bin/bash
YEARS="2014 2015 2016"
MONTHS="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"
for i in $YEARS
do
mkdir $i 2> /dev/null
echo -e "\\\\section{$i}\n" > $i/$i.tex
for j in $MONTHS
do
mkdir -p $i/$j 2> /dev/null
for k in `seq 1 31`
do
echo -e "\\\\mytitle{Some stuff}\n\\\\blindtext" > $i/$j/$k.tex
done
done
done
以下是一些输出