如何自动引入书中的章节标题

如何自动引入书中的章节标题

我正在使用 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.tex2014 年等中有一个等,其中包含类似 的内容\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

以下是一些输出

在此处输入图片描述

相关内容