解决方案基于docstrip

解决方案基于docstrip

file-a.tex

\tag{a1}

a-blabla.....

\tag{a2}

a-blabla....

file-b.tex

\tag{a1}

b-blabla...

\tag{a2}

b-blabla...

\tag{a3}

b-blabla

file-c.tex

\tag{a2}

c-blabla...

\tag{a1}

c-blabla...

all.tex

\documentclass....

.....

....

\input{file-a}

\input{file-b}

\input{file-c}

怎么才能生成?

a-blabla.....%来自文件-a

b-blabla...%来自文件-b

c-blabla...%来自文件-c

a-blabla....%来自文件-a

b-blabla...%来自文件-b

c-blabla...%来自文件-c

b-blabla...%来自文件-b

答案1

您的文件包括(file1.tex):

\tag{a1}
{a1-blabla..... from file1}

\tag{a2}
{a2-blabla.... from file1}

(在其他文件中也是如此)。然后您可以使用以下宏:

\def\sgdef#1{\expandafter\gdef\csname#1\endcsname}
\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}

\long\def\tag#1#2{\expandafter\ifx\csname tag:#1\endcsname \relax
    \sgdef{tag:#1}{#2\par}\else
    \global\expandafter\addto\csname tag:#1\endcsname{#2\par}\fi}

\def\printtag#1{\csname tag:#1\endcsname}

\input file1
\input file2
\input file3

\printtag{a1}
\printtag{a2}
\printtag{a3}

这是使用的简单练习\csname...\endcsname

答案2

解决方案基于docstrip

如果标签的形式可以自由选择,那么docstrip已经具备了这个能力。一个代码块的标签使用a1方式如下:

%<*a1>
... code block ...
%</a1>

%<*a1>以星号开始范围,%</a1>以斜线结束标记。如果代码块包含注释行,这些注释行不应被删除docstrip,则可以使用以下守卫:

%<*a1>
%<<GUARD
... code block ...
%GUARD
%</a1>

例如file-a.tex

%<*a1>
%<<GUARD
File=a, tag a1
%GUARD
%</a1>
%<*a2>
%<<GUARD
File a, tag a2
%GUARD
%</a2>
%<*a3>
%<<GUARD
File a, tag a3
%GUARD
%</a3>

file-all.ins然后需要一个驱动文件docstrip

% arara: tex
\input docstrip.tex
\Msg{* Generates file-all.tex from file-a.tex, file-b.tex, file-c.tex}
\keepsilent
\askforoverwritefalse
\nopreamble
\nopostamble
\generate{
  \file{file-all.tex}{
    \from{file-a.tex}{a1}
    \from{file-b.tex}{a1}
    \from{file-c.tex}{a1}
    \from{file-a.tex}{a2}
    \from{file-b.tex}{a2}
    \from{file-c.tex}{a2}
    \from{file-a.tex}{a3}
    \from{file-b.tex}{a3}
    \from{file-c.tex}{a3}
  }
}
\endbatchfile

编译文件不需要 LaTeX,普通 TeX(甚至 iniTeX)就足够了:

tex file-all.ins

然后docstrip写入文件file-all.tex

File=a, tag a1
File=b, tag a1
File=c, tag a1
File a, tag a2
File b, tag a2
File c, tag a2
File a, tag a3
File b, tag a3
File c, tag a3

当然,只要给定文件和标签名称,语句列表\from就可以自动计算。以下版本file-all.ins使用 pgf 的\foreach,也可以在纯 TeX 中使用:

% arara: tex
\input pgffor.tex
\input docstrip.tex
\Msg{* Generates file-all.tex from file-a.tex, file-b.tex, file-c.tex}
\keepsilent
\askforoverwritefalse
\nopreamble
\nopostamble

\gdef\fromlist{}
\begingroup
  \let\from\relax
  \foreach \tag in {a1, a2, a3} {
    \foreach \file in {file-a, file-b, file-c} {
       \xdef\fromlist{\fromlist
         \from{\file.tex}{\tag}%
       }
    }
  }
\endgroup

\generate{
  \file{file-all.tex}{\fromlist}
}
\endbatchfile

最后将该文件file-all.tex包含在主文档中,例如:

\input{file-all}

或者如果启用了 shell 转义功能,docstrip也可以将调用嵌入到主文档中:

\immediate\write18{tex file-all}% generate file-all.tex
\input{file-all}

答案3

这是一个使用collect包裹:

文件all.tex

\documentclass{article}
\usepackage{collect}

\definecollection{a1}
\definecollection{a2}
\definecollection{a3}

\begin{document}

\input{a.tex}
\input{b.tex}
\input{c.tex}

\includecollection{a1}
\includecollection{a2}
\includecollection{a3}

\end{document}

文件a.tex

\begin{collect}{a1}{}{}
a-blabla...  in file a.tex
\end{collect}

\begin{collect}{a2}{}{}
a-blabla...  in file a.tex
\end{collect}

文件b.tex

\begin{collect}{a1}{}{}
b-blabla...  in file b.tex
\end{collect}

\begin{collect}{a2}{}{}
b-blabla...  in file b.tex
\end{collect}

\begin{collect}{a3}{}{}
b-blabla...  in file b.tex
\end{collect}

文件c.tex

\begin{collect}{a2}{}{}
c-blabla...  in file c.tex
\end{collect}

\begin{collect}{a1}{}{}
c-blabla... in file c.tex
\end{collect}

结果:

在此处输入图片描述

相关内容