docmut 不起作用:只有第一个 \input 生效,其他的都被忽略

docmut 不起作用:只有第一个 \input 生效,其他的都被忽略

我的情况如下:

  • 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}

相关内容