我只想打印文件名中Ch
和之间的字符-
,因此我使用包currfile
和xstring
。例如:
\StrBetween[1,1]{\currfilename}{Ch}{-}
如果文件名是“Ch2-2nde.tex”或“Ch14-2nde.tex”,则应该给出 2 或 14,但不起作用。但如果我尝试,\StrBetween[1,1]{Ch2-2nde.tex}{Ch}{-}
它仍然\StrBetween[1,1]{Ch14-2nde.tex}{Ch}{-}
可以正常工作!我不明白...
答案1
您可以使用命令starred
选项\StrBetween
来获取结果。当输入包含命令时可以使用此选项。以下示例将有所帮助:
\StrBetween*[1,1]{\currfilename}{Ch}{-}
答案2
问题是\currfilename
返回一个“字符串化”的文件名;用 TeXnical 术语来说,所有字符都有类别代码 12。但是,您在第二个可选参数中提供的字符Ch
有类别代码 11,因此不匹配。
一种可能性是使用*
的变体\StrBetween
,它适用\detokenize
于所有强制参数(完全扩展后),因此也Ch
成为类别代码 12 并且找到匹配项。
另一种可能性是使用l3regex
。
\documentclass{article}
\usepackage{currfile,xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\extractnumber}{o}
{
\IfNoValueTF{#1}
{
\mathxlv_extract_number:N \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
{
\mathxlv_extract_number:N #1
}
}
\cs_new_protected:Nn \mathxlv_extract_number:N
{
\tl_set_eq:NN #1 \currfilename
\regex_replace_once:nnN { \A Ch ([^-]*) .* \Z } { \1 } #1
}
\ExplSyntaxOff
\begin{document}
\extractnumber
\extractnumber[\thisfilenumber]
\texttt{\meaning\thisfilenumber}
\end{document}
如果文档被命名Ch2-2nde.tex
,则输出为
如果文档被命名Ch14-abc-def.tex
,则输出为