| 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
。 为了获取可选命令,我使用了DeclareExpandableDocumentCommand
from(我认为)这里。
结合这些事实,我们得到宏的函数定义和先决条件如下:
% 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"
}