我要生成一份复杂的报告,但我不知道如何才能让它发挥最佳作用。首先,我认为使用 CSV 文件不是一个选择。
我有许多文件,名字像inc/long-name.tex
和,inc/longer-name.tex
每个文件都定义了带有图形、表格等的整个子部分。更改要编号的文件的名称并使用计数循环是不可取的。我希望使用假设的宏将这些文件导入主文档底部附近\customimport{category}{status}{long-name}
。
在文档的许多地方,无论是章节应该出现的上方还是下方,我都需要能够根据其类别生成导入子章节的计数和表格并显示其名称。例如,我有一个段落需要说:
有
\categoryfoonum
类别 foo 的实例、\categorybarnum
类别 bar 的实例和\categorybaznum
类别 bax 的实例。
在另一个地方,我需要一个表格,其中包含按调用顺序出现的子节的超链接引用、名称和类别\customimport
。例如,该表看起来类似于:
|---------+-----------------------+----------+--------|
| Number | Name | Category | Status |
|---------+-----------------------+----------+--------|
| Counter | Linked Name of Foo 1 | Foo | Status |
| Counter | Linked Name of Foo 2 | Foo | Status |
| Counter | Linked Name of Bar 1 | Bar | Status |
| Counter | Linked Name of Baz 1 | Baz | Status |
|---------+-----------------------+----------+--------|
实现这一目标的最佳方法是什么?
**编辑:示例代码**
\documentclass{report}
\usepackage{filecontents}
\begin{filecontents}{inc/long-name.tex}
\begin{incsection}{This name is from the file}
\par{Explanation}
This contains many tables and figures.
\end{incsection}
\end{filecontents}
\begin{filecontents}{inc/longer-name.tex}
\begin{incsection}{This name is from the other file}
\par{Explanation}
This contains many tables and figures.
\end{incsection}
\end{filecontents}
% Many more files will be in the inc directory...
\newenvironment{incsection}[1]{
% #1 needs to be available when creating the table and needs to be hyperref'd.
% Many other formatting commands here.
}{
% Many other formatting commands here.
}
\begin{document}
% Create category counters.
\newcounter{incnum}
\newcounter{categoryfoonum}
\newcounter{categorybarnum}
\newcounter{categorybaznum}
\newcommand{customimport}[3]{
% Remember how many things we're including.
\stepcounter{incnum}
% Remember how many of each category we're including.
\stepcounter{category#1num}
% This line breaks the example, not sure what to do instead.
\input{inc/#3}
}
% These numbers are used before \customimport is called.
\par There were \thecategoryfoonum instances of category foo, \thecategorybarnum
instances of category bar, and \thecategorybaznum instances of category baz.
% This table needs all rows to be dynamically generated, and needs to appear
% before \customimport is called.
\newcounter{rownum}
\begin{tabular}{ | c | l | c | c | }
\hline
Number & Name & Category & Status\\
\hline
% These lines need to be replaced...
S.\therownum\stepcounter{rownum} & This name is from the file & foo & status1 \\
S.\therownum\stepcounter{rownum} & This name is from the other file & bar & status2 \\
\hline
\end{tabular}
\subsection*{Foos}
\customimport{foo}{status1}{long-name}
% More foo files here...
\subsection*{Bars}
\customimport{bar}{status2}{longer-name}
% More bar files here...
\subsection*{Bazs}
% No baz files in this document instance...
\end{document}
答案1
我认为您的问题可能应该分成更易于处理的部分。下面的代码可能不是解决问题的方法,因为我使用 TeX Book 的索引来查找位,这可能不是解决问题的最佳方法。
买者自负...
如果您需要在文档中指定计数器的值或其他信息之前访问它们,那么您必须将该信息写入外部文件并在下次运行时将其读回。您无法实时访问它,因为需要信息的页面可能在信息可用之前就已排版(除非信息在需要它的页面发出之前可用,但这似乎不太可能)。
因此,您不能使用它\thecountername
来访问文档末尾的计数器的总值和用于countername
对文档中的某些内容进行计数。您可以创建单独的计数器,但这样做没什么意义。更直接的做法是创建一个宏来保存文档末尾的总计数。
为了确保我们在第一次运行时不会出现错误:
\let\totalbars\relax
\let\totalfoos\relax
\let\totalbazs\relax
第一次运行时,调用这些命令时不会排版任何内容。
然后,在文档的末尾,我们将相关计数器的值写入文件.aux
,并将其保存到相关的宏中:
\AtEndDocument{%
\protected@write\@auxout{}{%
\string\gdef\string\totalbars{\thecategorybarnum}%
\string\gdef\string\totalfoos{\thecategoryfoonum}%
\string\gdef\string\totalbazs{\thecategorybaznum}%
}%
}
处理表格的最简单方法可能是将行写入专用的外部文件,就像写入目录一样.toc
。
以下假设所有相关文件仅在表格排版后才输入。这简化了事情(至少对我来说是概念上的),所以,既然您这么说,我就根据这个假设来做。
然后\cattoc
将排版表格:
\newcommand\cattoc{%
\begin{center}
\begin{tabular}{ c l c c }
\toprule
Number & Name & Category & Status\\
\midrule
\input \jobname.cat
\bottomrule
\end{tabular}
\newwrite\writecattoc
\immediate\openout\writecattoc=\jobname.cat
\end{center}
}
这将读入作为表的一部分的内容\jobname.cat
,然后打开一个流,该流将作为的一部分写入文档末尾的文件中\AtEndDocument{}
:
\closeout\writecattoc
然后\incsection
需要将表的相关行写入到文件中:
\newenvironment{incsection}[1]{%
\immediate\write\writecattoc{%
S.\string\therownum\string\stepcounter{rownum} & #1 & \csname currentcategory\endcsname & \csname currentstatus\endcsname \string\\
}
}{%
}
其中\currentcategory
和\currentstatus
反映自定义输入命令要设置的值:
\let\currentcategory\relax
\let\currentstatus\relax
\newcommand\customimport[3]{%
\stepcounter{incnum}%
\expandafter\stepcounter{category#1num}%
\gdef\currentcategory{#1}%
\gdef\currentstatus{#2}%
\input{#3}%
}
我不确定它incnum
有什么用处,因为它似乎从未被使用过。但我把它留在这里,以防你现在有它的用途。
那么,第二次编译的输出看起来就像这样:
Hyperref 链接留给读者作为练习或作为未来问题的主题。
完整代码:
\begin{filecontents}{long-name.tex}
\begin{incsection}{This name is from the file}
Explanation\par
This contains many tables and figures.
\end{incsection}
\end{filecontents}
\begin{filecontents}{longer-name.tex}
\begin{incsection}{This name is from the other file}
Explanation\par
This contains many tables and figures.
\end{incsection}
\end{filecontents}
\documentclass{report}
\usepackage{booktabs}
\newenvironment{incsection}[1]{%
\immediate\write\writecattoc{%
S.\string\therownum\string\stepcounter{rownum} & #1 & \csname currentcategory\endcsname & \csname currentstatus\endcsname \string\\
}
}{%
}
% Create category counters.
\newcounter{incnum}
\newcounter{categoryfoonum}
\newcounter{categorybarnum}
\newcounter{categorybaznum}
\newcounter{rownum}
\let\totalbars\relax
\let\totalfoos\relax
\let\totalbazs\relax
\let\currentcategory\relax
\let\currentstatus\relax
\newcommand\customimport[3]{%
\stepcounter{incnum}%
\expandafter\stepcounter{category#1num}%
\gdef\currentcategory{#1}%
\gdef\currentstatus{#2}%
\input{#3}%
}
\makeatletter
\AtEndDocument{%
\protected@write\@auxout{}{%
\string\gdef\string\totalbars{\thecategorybarnum}%
\string\gdef\string\totalfoos{\thecategoryfoonum}%
\string\gdef\string\totalbazs{\thecategorybaznum}%
}%
\closeout\writecattoc
}
\newcommand\cattoc{%
\begin{center}
\begin{tabular}{ c l c c }
\toprule
Number & Name & Category & Status\\
\midrule
\input \jobname.cat
\bottomrule
\end{tabular}
\newwrite\writecattoc
\immediate\openout\writecattoc=\jobname.cat
\end{center}
}
\makeatother
\begin{document}
There were \totalfoos{} instances of category foo, \totalbars{} instances of category bar, and \totalbazs{} instances of category baz.
\cattoc
\subsection*{Foos}
\customimport{foo}{status1}{long-name}
\subsection*{Bars}
\customimport{bar}{status2}{longer-name}
\subsection*{Bazs}
\end{document}