如何在 \IfFileExists 中使用动态生成的文件名?

如何在 \IfFileExists 中使用动态生成的文件名?

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。强制参数是要打印的实际数字。

我还擅自创建了一个\forloopexpl3。您可以使用此处包中的宏forloop,它不会引起问题。新\forloop宏的语法为:\forloop{<first>}[<step>]{<last>}{<code>},其中<first><last>是循环的开始和结束,<step>是增量(默认值为 1),是<code>每次循环迭代时要执行的任意 TeX 代码。在里面,<code>循环计数器的当前值可用作#1

创建两个示例文件00110013输出为:

在此处输入图片描述

代码:

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

相关内容