有没有简单的方法可以在.tex 中循环此脚本:
\immediate\openout\mytest1=test1.tex
\immediate\openout\mytest2=test2.tex
\immediate\openout\mytest3=test3.tex
\immediate\openout\mytest4=test4.tex
\immediate\openout\mytest5=test5.tex
我认为 \foreach 循环效果最好,但我对 Latex 如何查看变量并将它们附加到文本名称非常不熟悉。
如果有人能给我一个起点,那将会非常有帮助。
@David:我正在尝试使用您创建的示例来循环以下内容:
\newwrite\mytest1
\newwrite\mytest2
\newwrite\mytest3
\newwrite\mytest4
\newwrite\mytest5
\makeatletter
\NewEnviron{test1}{%
\toks@=\expandafter{\BODY}%
\immediate\write\mytest1{\the\toks@}}
\makeatother
\makeatletter
\NewEnviron{test2}{%
\toks@=\expandafter{\BODY}%
\immediate\write\mytest2{\the\toks@}}
\makeatother
\makeatletter
\NewEnviron{test3}{%
\toks@=\expandafter{\BODY}%
\immediate\write\mytest3{\the\toks@}}
\makeatother
\makeatletter
\NewEnviron{test4}{%
\toks@=\expandafter{\BODY}%
\immediate\write\mytest4{\the\toks@}}
\makeatother
\makeatletter
\NewEnviron{test5}{%
\toks@=\expandafter{\BODY}%
\immediate\write\mytest5{\the\toks@}}
\makeatother
我将您的代码保留在文档正文中,但将 \newwrite 行移到序言中的循环中以模仿上面的前五行。然后,我使用与您定义新环境相同的语言:test1、test2 等。然后我在 \NewEnviron 命令中使用附加的名称。最终,我希望代码为循环中的每个计数定义一个新环境,然后将该文本写入我们正在创建的新 .tex 文件中。但是,我想知道 \NewEnviron 是否因为扩展问题而拒绝该名称。
\makeatletter
\count@\z@
\loop
\advance\count@\@ne
\ifnum\count@<6
\expandafter\newwrite\csname mytest\the\count@ \endcsname
\expandafter\newwrite\csname test\the\count@ \endcsname
\NewEnviron{\csname test\the\count@ \endcsname}{%
\toks@=\expandafter{\BODY}%
\immediate\write\csname mytest\the\count@\endcsname{\the\toks@}}
\repeat
答案1
以下生成 test1.tex .. test5.tex
\makeatletter
\count@\z@
\loop
\advance\count@\@ne
\ifnum\count@<6
\expandafter\newwrite\csname mytest\the\count@\endcsname
\immediate\openout\csname mytest\the\count@\endcsname=test\the\[email protected]
\repeat
\stop
如果您希望命令名称是\mytestA
...使用
\expandafter\newwrite\csname mytest\@Alph\count@\endcsname
\immediate\openout\csname mytest\@Alph\count@\endcsname=test\the\[email protected]
如果你希望文件名也使用字母,请使用
\expandafter\newwrite\csname mytest\@Alph\count@\endcsname
\immediate\openout\csname mytest\@Alph\count@\endcsname=test\@Alph\[email protected]
请注意,您不能使用 访问控件名称 mytest1\mytest1
您需要\csname mytest1\endcsname
。
答案2
以下代码创建并打开文件
myAlphtestA.tex
myAlphtestB.tex
myAlphtestC.tex
myAlphtestD.tex
myarabictest1.tex
myarabictest2.tex
myarabictest3.tex
myarabictest4.tex
myRomantestI.tex
myRomantestII.tex
myRomantestIII.tex
myRomantestIV.tex
和“写入” \myAlphtestA
,...,,\myRomantestI
...,,\myarabictest1
...,其中阿拉伯语只能通过 访问\csname myarabictest1\endcsname
。
(应该扩展密钥和/或使用已经为此制作的包...)
代码
\documentclass{article}
\usepackage{pgffor,pgfkeys}
\newcommand*{\fileset}{\pgfqkeys{/file}}
\makeatletter
\fileset{
name/.initial=mytest,
ext/.initial=tex,
immediate/.code={\csname if#1\endcsname\let\file@immediate@or@not\immediate\else\let\file@immediate@or@not\relax\fi},
immediate/.default=true,
func/.code={\expandafter\let\expandafter\file@func\csname @#1\endcsname},
newwrite/.code={\expandafter\newwrite\csname\pgfkeysvalueof{/file/name}\file@func{#1}\endcsname},
openout/.code={\file@immediate@or@not\openout\csname\pgfkeysvalueof{/file/name}\file@func{#1}\endcsname=\pgfkeysvalueof{/file/name}\file@func{#1}.\pgfkeysvalueof{/file/ext}\relax},
%defaults:
func=Alph,
immediate
}
\makeatother
\begin{document}
Hello World
\fileset{
name=myAlphtest,
newwrite/.list={1,...,4},
openout/.list={1,...,4}
}
\fileset{
func=arabic,
name=myarabictest,
newwrite/.list={1,...,4},
openout/.list={1,...,4}
}
\fileset{
func=Roman,
name=myRomantest,
newwrite/.list={1,...,4},
openout/.list={1,...,4}
}
\end{document}