如何在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

我按照@DavidCarlisle 的建議使用\@percentchar,它按預期工作。

\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 %

相關內容