シェルコマンドでパーセント記号をエスケープする方法

シェルコマンドでパーセント記号をエスケープする方法

私は、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以下を参照)。しかし、同僚の 1 人がエイリアスを定義せずにコンパイルしようとすると失敗します。いいえ、彼らは 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 %

関連情報