Como escapar do sinal de porcentagem no comando shell

Como escapar do sinal de porcentagem no comando shell

Estou trabalhando em uma macro que criará uma tabela de histórico de revisões em meu documento usando tags Git. Cada versão publicada do meu documento possui uma tag com uma breve descrição. Quero usá-los para construir automaticamente uma tabela de revisão durante a compilação com XeLaTeX no Windows.

Usando o comando Git abaixo, obtenho todas as informações necessárias para criar a tabela de histórico de revisões. A saída é formatada em formato semelhante a CSV.

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

Eu modifiquei ummacro para analisar arquivo CSVpara que eu possa ler a saída do comando Git e construir minha tabela de histórico de revisões (ainda não formatada como tabela no script).

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

Ele funciona com a saída pré-salva do comando, mas quando colo a string completa do comando \@@inpute tento compilar ( xelatex -shell-escape .\read-git-history-test.tex), o XeLaTeX reclama:

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

Eu fiz uma solução alternativa definindo o alias do Git ( git revhist-veja abaixo), mas se um dos meus colegas tentar compilá-lo sem definir o alias, ele falhará. Não, eles não leem REDAME...

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

É possível chamar o comando completo do Git no *.texarquivo para não corrompê-lo pelos %sinais?

Responder1

Usei \@percentcharconforme sugerido por @DavidCarlisle e funcionou conforme o esperado.

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

informação relacionada