我使用以下行将包含文档源代码的 git 存储库名称写入 PDF:
\input|"git config --get remote.origin.url | xargs basename"
我遇到了一个名称中带有下划线的存储库的问题,例如repo_name
,因为特殊字符使我的编译器切换到数学模式。
我可能可以使用\catcode
如图所示的其他答案,但不仅仅是下划线可能会导致问题,而且我希望它能够抵御目录名称中可能出现的所有特殊字符。
答案1
您可以使用catchfile
:
\documentclass{article}
\usepackage{catchfile}
\begin{document}
\CatchFileDef\repository{|"kpsewhich eng_rs.sty | xargs basename"}{\catcode`_=12 }
\texttt{\repository}
\texttt{\meaning\repository}
\end{document}
我使用带有下划线的文件名,仅作为示例。
可能更好的版本,具有xparse
:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\getfilename}{O{}mo}
{
% #1 = optional list of characters to be made printable
% #2 = variable part
% #3 = optional command to save the returned token list in
\tl_set_from_file:Nnn \l_maciek_filename_tl
{
\maciek_filename_setother:n { #1 }
}
{
|"#2"
}
\IfValueTF{#3}
{
\tl_clear_new:N #3
\tl_set_eq:NN #3 \l_maciek_filename_tl
}
{
\tl_use:N \l_maciek_filename_tl
}
}
\cs_new_protected:Nn \maciek_filename_setother:n
{
\tl_map_function:nN { #1 } \char_set_catcode_other:N
}
\ExplSyntaxOff
\begin{document}
\getfilename[_]{kpsewhich eng_rs.sty | xargs basename}
\getfilename[_]{kpsewhich eng_rs.sty | xargs dirname}[\foo]
\meaning\foo
\getfilename[\%]{ls | grep b}
\getfilename[\%_]{ls | grep y}
\end{document}
我创建了两个文件a%b.tex
,a_x%y.tex
只是为了展示第一个可选参数的用法。反斜杠、百分号和井号 ( ) 等字符需要使用反斜杠#
。