如何告诉输入命令忽略特殊字符(如动词模式)?

如何告诉输入命令忽略特殊字符(如动词模式)?

我使用以下行将包含文档源代码的 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.texa_x%y.tex只是为了展示第一个可选参数的用法。反斜杠、百分号和井号 ( ) 等字符需要使用反斜杠#

在此处输入图片描述

相关内容