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}
结果: