![docmut 不起作用:只有第一个 \input 生效,其他的都被忽略](https://linux22.com/image/311425/docmut%20%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9A%E5%8F%AA%E6%9C%89%E7%AC%AC%E4%B8%80%E4%B8%AA%20%5Cinput%20%E7%94%9F%E6%95%88%EF%BC%8C%E5%85%B6%E4%BB%96%E7%9A%84%E9%83%BD%E8%A2%AB%E5%BF%BD%E7%95%A5.png)
我的情况如下:
mytabclass
是一个仅用于定义创建表的宏的文档类。- 任何继承自的输入文件的主体
mytabclass
只能包含一些行。文档主体内不能定义除行之外的其他排版项目。 - 当
docmute
包被加载时mytabclass
,任何继承自的输入文件mytabclass
也可以导入同样继承自的其他输入文件mytabclass
。
最小工作示例
\begin{filecontents*}{mytabclass.cls}
\ProvidesClass{mytabclass}[2015/05/14 this is my table class]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[]{article}
\RequirePackage{longtable,array,etoolbox}
\newcounter{counter}
\newcolumntype\specifier{%
|
*2{>{\centering\stepcounter{counter}\thecounter}m{1cm}
|>{\centering}m{0.5\dimexpr\linewidth-2cm-8\tabcolsep-5\arrayrulewidth\relax}
|}
}
\def\row[#1]#2{%
& \parbox[c][0.2\dimexpr\textheight-6\arrayrulewidth-\topskip\relax][c]{\linewidth}{\centering #1 \par \vspace{15pt} #2}
\ifodd\value{counter}
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{&}{\tabularnewline\hline}
}
\pagestyle{empty}
\AfterEndPreamble{%
\begin{longtable}{\specifier}\hline
}
\preto\enddocument{\ifodd\value{counter}\omit\tabularnewline\cline{1-2}\fi\end{longtable}}
\RequirePackage{docmute}
\RequirePackage{pgffor}
\endinput
% mytabclass.cls
\end{filecontents*}
\begin{filecontents*}{chapter-1.tex}
\documentclass[12pt]{mytabclass}
\begin{document}
\row[A]{B}
\row[C]{D}
\row[E]{F}
\end{document}
\end{filecontents*}
\begin{filecontents*}{chapter-2.tex}
\documentclass[12pt]{mytabclass}
\begin{document}
\row[G]{H}
\row[I]{J}
\row[K]{L}
\end{document}
\end{filecontents*}
\documentclass[12pt]{mytabclass}
\begin{document}
\input{chapter-1}
\input{chapter-2}
\end{document}
问题
上面的 MWE 应该生成一个表,其中包含从chapter-1
和导入的行chapter-2
。不幸的是,如果您编译上面的 MWE,您会注意到chapter-2
不会被导入。是什么原因导致了这个问题以及如何解决它?
笔记
实际情况是采用“分而治之”的理念来加快开发阶段。这意味着每一章都必须是一个可编译的输入文件。它包含大量的行。例如,如果我只处理第 6 章,我只需要编译这个输入文件。如果我将所有行(来自所有章节)放在一个主输入文件中,那么在开发单个章节时将浪费大量时间。
当我在最后阶段编译主要输入文件时(所有章节都得到适当开发之后),我只想要一个共享相同计数器的表。
答案1
正如评论中所述,我不会修补document
以添加longtable
或允许包含它。只需将表的主体存储在单独的文件中,以包含在合适的包装器文档中。
在主文件上运行 latex 将生成一个组合表,在它上面运行(比如说)chapter-2.tex
将只生成该章节的行,
\begin{filecontents*}{mytabclass.cls}
\ProvidesClass{mytabclass}[2015/05/14 this is my table class]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[]{article}
\RequirePackage{longtable,array,etoolbox}
\newcounter{counter}
\newcommand\finalline{%
\ifodd\value{counter}\omit\tabularnewline\cline{1-2}\fi
}
\newcolumntype\specifier{%
|
*2{>{\centering\stepcounter{counter}\thecounter}m{1cm}
|>{\centering}m{0.5\dimexpr\linewidth-2cm-8\tabcolsep-5\arrayrulewidth\relax}
|}
}
\def\row[#1]#2{%
& \parbox[c][0.2\dimexpr\textheight-6\arrayrulewidth-\topskip\relax][c]{\linewidth}{\centering #1 \par \vspace{15pt} #2}
\ifodd\value{counter}
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{&}{\tabularnewline\hline}
}
\pagestyle{empty}
\endinput
% mytabclass.cls
\end{filecontents*}
\begin{filecontents*}{chapter-1.tex}
\documentclass[12pt]{mytabclass}
\begin{document}
\begin{longtable}{\specifier}\hline
\input{chapter-1.tbl}
\finalline
\end{longtable}
\end{document}
\end{filecontents*}
\begin{filecontents*}{chapter-1.tbl}
\row[A]{B}
\row[C]{D}
\row[E]{F}
\end{filecontents*}
\begin{filecontents*}{chapter-2.tex}
\documentclass[12pt]{mytabclass}
\begin{document}
\begin{longtable}{\specifier}\hline
\input{chapter-2.tbl}
\finalline
\end{longtable}
\end{document}
\end{filecontents*}
\begin{filecontents*}{chapter-2.tbl}
\row[G]{H}
\row[I]{J}
\row[K]{L}
\end{filecontents*}
\documentclass[12pt]{mytabclass}
\begin{document}
\begin{longtable}{\specifier}\hline
\input{chapter-1.tbl}
\input{chapter-2.tbl}
\finalline
\end{longtable}
\end{document}
答案2
为了让我的生活更简单,我将做以下事情。它部分基于 David Carlisle 的解决方案。
\begin{filecontents*}{template.tex}
\documentclass[12pt]{article}
\usepackage{longtable,array,etoolbox}
\newcounter{counter}
\makeatletter
\newcolumntype\specifier{%
|
*2{>{\centering\stepcounter{counter}\thecounter}m{1cm}
|>{\centering}m{0.5\dimexpr\linewidth-2cm-8\tabcolsep-5\arrayrulewidth\relax}
|}
}
\def\row[#1]#2{%
& \parbox[c][0.2\dimexpr\textheight-6\arrayrulewidth-\topskip\relax][c]{\linewidth}{\centering #1 \par \vspace{15pt} #2}
\ifodd\value{counter}
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{&}{\tabularnewline\hline}
}
\newcommand\finalline{%
\ifodd\value{counter}\omit\tabularnewline\cline{1-2}\fi
}
\makeatother
\begin{document}
\begin{longtable}{\specifier}
\hline
\input{\InputFileName}
\finalline
\end{longtable}
\end{document}
\end{filecontents*}
\begin{filecontents*}{selector.tex}
echo off
rem %1 input file without extension
pdflatex -jobname="%~1" "\def\InputFileName{%~1}\input{template}"
\end{filecontents*}
\immediate\write18{cmd /c rename selector.tex selector.bat && cmd /c del selector.tex}
\begin{filecontents*}{chapter-1.tex}
\row[A]{B}
\row[C]{D}
\row[E]{F}
\end{filecontents*}
\begin{filecontents*}{chapter-2.tex}
\row[G]{H}
\row[I]{J}
\row[K]{L}
\end{filecontents*}
\begin{filecontents*}{main.tex}
\input{Chapter-1}
\input{Chapter-2}
\end{filecontents*}
% simulating
\documentclass[12pt]{article}
\usepackage{pdfpages}
\begin{document}
\def\filename{main}
% creating
\immediate\write18{selector \filename}
% verifying
\includepdf[pages=-]{\filename}
\end{document}