shellescape 宏嵌套在另一个宏中

shellescape 宏嵌套在另一个宏中

| echo "stuff"如果其中包含“坏”字符,我该如何使用 shellescape ( ) 宏作为另一个宏的输入_

我将用我的完整示例作为参考。

这个想法是取代\lstinputlisting{|\string"git archive --remote=ssh://git@server/repo.git VERSION path/to/file 2>/dev/null | tar --extract --file - --to-stdout\string"}

使用这样的宏

% set these so they can later be redefined
\providecommand{\GitRemote}{}
\providecommand{\GitIdentifier}{master}

\providecommand{\GitCheckout}[2][\GitIdentifier]{%
% #1 being the version/branch
% #2 being the file
| \string"git archive --remote=\GitRemote #1 \detokenize{#2} 2>/dev/null | tar --extract --file - --to-stdout \string"%
}

使用 \lstinputlisting{\GitCheckout{path_to_file.py}}

梅威瑟:

\documentclass{article}
\usepackage{listings}
\providecommand{\GitRemote}{}
\providecommand{\GitIdentifier}{master}
\providecommand{\GitCheckout}[2][\GitIdentifier]{%
% #1 being the version/branch
% #2 being the file
| \string"git archive --remote=\GitRemote #1 \detokenize{#2} 2>/dev/null | tar --extract --file - --to-stdout \string"%
}
\begin{document}
renewcommand{\GitRemote}{ssh://[email protected]/sage.git}
\lstinputlisting{\GitCheckout{src/sage/coding/goppa.py}}
\end{document}

但我一直收到这样的错误

mwe.tex|10 error| Use of \\GitCheckout doesn't match its definition.

所以看起来有些逃避正在\发生\\

答案1

这段代码有多个问题:

如果用作输入,我们不想转义任何字符,并且正如@David Carlisle提到的那样,输入lsinputlistings需要扩展。 可选结构,正如@egreg提到的那样,最好委托给xparse。 为了获取可选命令,我使用了DeclareExpandableDocumentCommandfrom(我认为)这里

结合这些事实,我们得到宏的函数定义和先决条件如下:

% https://tex.stackexchange.com/questions/501640/shellescape-macro-nested-in-another-macro?noredirect=1#comment1266953_501640
\usepackage{xparse}

% this is set as fallback
\NewDocumentCommand{\GitRemote}{}{}
\NewDocumentCommand{\GitIdentifier}{}{master}


\NewExpandableDocumentCommand{\GitCheckout} {O{\GitIdentifier} O{\GitRemote} m} {%
|"git archive --remote=#2 #1 #3 2>/dev/null | tar --extract --file - --to-stdout"
}

相关内容