
Um tempo atrásPergunteicomo estender o cunhado para destacar com cores as palavras-chave escolhidas. O consenso foi “fazer as mudanças no programa de pigmentos externos” – e foi o que fiz.
As mudanças são pequenas e a saída do meu programa pygment modificado parece estar boa.Se eu instalar meu novo módulo pygment em todo o sistema, meu documento será compilado corretamente e as alterações no realce de sintaxe serão as esperadas.
O problema é que não quero instalar meu módulo substituto de pigmento em todo o sistema, isso é muito invasivo e quero poder distribuir meu documento para compilação nos computadores de outras pessoas. Eu tenho um script bash simples bin/pygmentize.sh
que invoca a nova versão do pygmentize como um conjunto de scripts locais.Este script bash é um substituto testado e funcional para o pygmentize
programa global.Além disso, quando é invocado via latex/cunhado no manar mostrado abaixo, ele gera a marcação correta, mas o documento não é compilado.
Aqui está uma comparação da marcação que minha pigmentização alterada gera em relação à original:
Antes:
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{c+cp}{\PYGZsh{}include} \PYG{c+cpf}{\PYGZlt{}stdio.h\PYGZgt{}}
\PYG{k+kt}{void} \PYG{n+nf}{main} \PYG{p}{()}
\PYG{p}{\PYGZob{}}
\PYG{n+nf}{printf} \PYG{p}{(}\PYG{l+s}{\PYGZdq{}Hello, world!\PYGZdq{}}\PYG{p}{);}
\PYG{p}{\PYGZcb{}}
\end{Verbatim}
Depois:
\begin{Verbatim}[commandchars=\\\{\}]
\PYG{c+cp}{\PYGZsh{}include} \PYG{c+cpf}{\PYGZlt{}stdio.h\PYGZgt{}}
\PYG{k+kt}{void} \PYG{n+nf}{main} \PYG{p}{()}
\PYG{p}{\PYGZob{}}
\PYG{n}{printf} \PYG{p}{(}\PYG{l+s}{\PYGZdq{}Hello, world!\PYGZdq{}}\PYG{p}{);}
\PYG{p}{\PYGZcb{}}
\end{Verbatim}
Este código foi retirado do diretório de cache criado em ambos os casos, foi gerado através da invocação do latex pygmentize
, e não da minha própria invocação manual. (Excluí o cache criado, passei a usar meu pigmento atualizado e executei o pdflatex novamente.)
A única diferença entre a marcação gerada é que \PYG{n}{printf}
eu \PYG{n+nf}{printf}
esperaria que o restante do documento fosse compilado da mesma maneira. Não tão
(/tmp/test/minted-cache/D855E0EC6A86300E2FD8FEE675873CCC2C2645CE96B6E2A989A9815
F3192183A.pygtex
! Undefined control sequence.
<argument> \PYG {c+cp}{\PYGZsh
{}include} \PYG {c+cpf}{\PYGZlt {}stdio.h\PYG...
l.2 ...ude} \PYG{c+cpf}{\PYGZlt{}stdio.h\PYGZgt{}}
! ==> Fatal error occurred, no output PDF file produced!
Este erro ocorre ao compilar a marcação acima. Se estou lendo corretamente, é o \PYGZsh
comando que não é reconhecido. Este erro me parece muito estranho - o minted está claramente carregando e executando, o \PYG
comando anteriorerareconhecido como uma sequência de controle, e o erro se manifesta em uma seção de código que não foi alterada.
Veja como fiz com que minha pigmentação alterada fosse invocada: vasculhando a fonte cunhada, vi isto:
\ifcsname MintedPygmentize\endcsname\else
\newcommand{\MintedPygmentize}{pygmentize}
\fi
Então um pouco mais tarde
\MintedPygmentize\space -l #2 -f latex -P commandprefix=PYG -F tokenmerge (...etc)
Parece que, ao definir ou redefinir, \MintedPygmentize
eu poderia invocar um programa diferente.
Eu tentei fazer isso antes de importar cunhado
\newcommand{\MintedPygmentize}{bash bin/pygmentize.sh}
e tentei fazer isso depois de importar cunhado
\renewcommand{\MintedPygmentize}{bash bin/pygmentize.sh}
De qualquer maneira, produz o erro. Confirmei que my bin/pygmentize.sh
foi invocado e que está recebendo suas entradas e produzindo suas saídas.
Concluí que a redefinição \MintedPygmentize
causou alguns efeitos colaterais da magia negra.
Então, para ter um documento compilável portável, como posso dizer ao pacote criado para usar meu script externo para gerar a marcação de uma forma que não cause erros estranhos como esse?
Responder1
A razão pela qual \renewcommand{\MintedPygmentize}{bash bin/pygmentize.sh}
não está funcionando para você é devido à forma como a pygmentize
verificação é implementada no minted.
Está linhaé o que executa a verificação em sistemas não Windows (por exemplo, Linux, macOS):
\immediate\write18{which #1 && touch \jobname.aex}
\IfFileExists{\jobname.aex}
{\AppExiststrue
\DeleteFile{\jobname.aex}}
{\AppExistsfalse}
\fi}
Seu comando personalizado é expandido para:
which bash bin/pygmentize.sh && touch \jobname.aex
Que encontra o bash, mas não o bin/pygmentize.sh
. A solução é tornar bin/pygmentize.sh
executável ( chmod u+x bin/pygmentize.sh
) para que which
não retorne um erro ou ignorar completamente a verificação. Você pode ignorar a verificação declarando seu comando como:
\renewcommand{\MintedPygmentize}{which ; bash bin/pygmentize.sh}
Isso será expandido para: which which; bash bin/pygmentize.sh && touch \jobname.aex
e, portanto, passará na verificação. Em invocações reais, which ;
não produz nenhuma saída, portanto toda a invocação do comando se comportará como se esta parte do comando não estivesse lá.