如何在 shell 命令中转义百分号

如何在 shell 命令中转义百分号

我正在开发一个宏,它将使用 Git 标签在我的文档中构建修订历史表。我的文档的每个发布版本都有一个带有简短描述的标签。我想在 Windows 中使用 XeLaTeX 进行编译时使用它们自动构建修订表。

使用下面的 Git 命令,我获得了创建修订历史表所需的所有信息。输出格式为类似 CSV 的格式。

git for-each-ref --format='%(refname:short); %(taggerdate:short); %(subject); %(*authorname); %(*authoremail)' refs/tags

我修改了一个用于解析 CSV 文件的宏这样我就可以读取 Git 命令的输出并构建我的修订历史记录表(尚未格式化为脚本中的表格)。

\documentclass{article}

\newcommand{\printrow}[5]{tag: #1 (#3) at #2 by #4 #5 + \\}

\begin{document}

\def\readrow #1;#2;#3;#4;#5;{\ifx^#5^\else 
   \printrow{#1}{#2}{#3}{#4}{#5}%
   \expandafter\readrow\fi}
\def\startread {\readrow} % skip first row
\begingroup
   \endlinechar=`; \everyeof={;;;;;} \catcode`\@=11
   \expandafter \startread \@@input |"git revhist" %
\endgroup % 

\end{document}

它适用于预先保存的命令输出,但是当我将完整的命令字符串粘贴到\@@input并尝试编译(xelatex -shell-escape .\read-git-history-test.tex)时,XeLaTeX 会抱怨:

{|"git for-each-ref --format='
! Paragraph ended before \@iinput was complete.
<to be read again>
                   \par

我通过定义 Git 别名(见下文)找到了解决方法git revhist,但如果我的一位同事尝试在不定义别名的情况下编译它,它就会失败。不,他们没有读过 REDAME 的...

git config --global alias.revhist "for-each-ref --format='%(refname:short); %(taggerdate:short); %(subject); %(*authorname); %(*authoremail);' refs/tags"

是否可以在*.tex文件中调用完整的 Git 命令以免被符号破坏%

答案1

\@percentchar按照@DavidCarlisle 的建议进行操作,并且效果如预期。

\def\readrow #1;#2;#3;#4;#5;{\ifx^#5^\else
   \addrevision{#1}{#2}{#4}{#3}%
   \expandafter\readrow\fi}
\def\startread {\readrow} % skip first row
\begingroup
   \endlinechar=`; \everyeof={;;;;;} \catcode`\@=11
   \expandafter \startread \@@input |"git for-each-ref --format='\@percentchar(refname:short); \@percentchar(taggerdate:short); \@percentchar(subject); \@percentchar(*authorname); \@percentchar(*authoremail)' refs/tags" %
\endgroup %

相关内容