Как экранировать знак процента в команде shell

Как экранировать знак процента в команде shell

Я работаю над макросом, который будет строить таблицу истории ревизий в моем документе с использованием тегов Git. Каждая опубликованная версия моего документа имеет тег с кратким описанием. Я хочу использовать их для автоматического построения таблицы ревизий при компиляции с помощью XeLaTeX в Windows.

Используя команду 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"

Можно ли вызвать полную команду Git в *.texфайле, не повреждая его знаками %?

решение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 %

Связанный контент