Como você especifica corretamente uma alternativa ao comando externo pygmentize para cunhado?

Como você especifica corretamente uma alternativa ao comando externo pygmentize para cunhado?

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.shque invoca a nova versão do pygmentize como um conjunto de scripts locais.Este script bash é um substituto testado e funcional para o pygmentizeprograma 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 \PYGZshcomando que não é reconhecido. Este erro me parece muito estranho - o minted está claramente carregando e executando, o \PYGcomando 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, \MintedPygmentizeeu 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.shfoi invocado e que está recebendo suas entradas e produzindo suas saídas.

Concluí que a redefinição \MintedPygmentizecausou 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 pygmentizeverificaçã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.shexecutável ( chmod u+x bin/pygmentize.sh) para que whichnã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.aexe, 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á.

informação relacionada