0012
我在以下文件的目录中有一个文件。我想检查11 到 13 之间 tex
的文件是否存在。\forloop
\documentclass{article}
\usepackage{numprint}
\newcounter{ct}
\newcommand{\fileno}{\npfourdigitnosep\nplpadding{4}\numprint{\arabic{ct}}}
\usepackage{forloop}
\setlength\parindent{0pt}
\begin{document}
\forloop{ct}{11}{\value{ct} < 14} {
% \IfFileExists{0012} {
\IfFileExists{\fileno} {
fileno: "\fileno{}" exists! \\
} {
fileno: "\fileno{}" doesn't exist! \\
}
}
\end{document}
我收到此编译错误:
! Incomplete \iffalse; all text was ignored after line 15.
<inserted text>
\fi
如果我切换到,则没有编译器错误
\IfFileExists{0012}
输出结果如下:
fileno: ”0011” exists!
fileno: ”0012” exists!
fileno: ”0013” exists!
我如何使用宏检查文件的存在\fileno
?
我想要这个输出:
fileno: ”0011” doesn't exist!
fileno: ”0012” exists!
fileno: ”0013” doesn't exist!
答案1
问题是需要\IfFileExists
扩展为字符串的东西,即文件名。但是,中的宏numprint
不能安全地扩展为字符串,因为它们会执行赋值等操作。您可以进行设置(我认为它们是设置)\npfourdigitnosep\nplpadding{4}
外部,\IfFileExists
但\numprint
本身不可扩展,所以你必须想办法存储打印的数字和只有那时传给\IfFileExists
。工作量太大了 :-)
使用xparse
一些expl3
函数,你可以\fileno
安全地扩展:D
我让\fileno
宏接受一个可选参数,然后接受一个强制参数。可选参数是要打印的数字的宽度。如果没有给出可选参数,则默认值为 4。强制参数是要打印的实际数字。
我还擅自创建了一个\forloop
宏expl3
。您可以使用此处包中的宏forloop
,它不会引起问题。新\forloop
宏的语法为:\forloop{<first>}[<step>]{<last>}{<code>}
,其中<first>
和<last>
是循环的开始和结束,<step>
是增量(默认值为 1),是<code>
每次循环迭代时要执行的任意 TeX 代码。在里面,<code>
循环计数器的当前值可用作#1
。
创建两个示例文件0011
,0013
输出为:
代码:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand \fileno { O{4} m }
{ \exp_args:Nf \kopi_leading_zeros:nn { \int_eval:n {#2} } {#1} }
\cs_new:Npn \kopi_leading_zeros:nn #1 #2
{ \prg_replicate:nn { #2 - \str_count:n {#1} } { 0 } \int_eval:n {#1} }
\NewDocumentCommand \forloop { m O{1} m m }
{ \int_step_inline:nnnn {#1} {#2} {#3} {#4} }
\ExplSyntaxOff
% Dummy files
\begin{filecontents}{0011}
blub
\end{filecontents}
\begin{filecontents}{0013}
zzzz
\end{filecontents}
\setlength\parindent{0pt}
\begin{document}
\forloop{11}{13}{%
\IfFileExists {\fileno{#1}} {%
fileno: ``\fileno{#1}'' exists! \\
} {%
fileno: ``\fileno{#1}'' doesn't exist! \\
}%
}
\end{document}