¿Cómo se especifica correctamente una alternativa al comando externo pygmentize para acuñado?

¿Cómo se especifica correctamente una alternativa al comando externo pygmentize para acuñado?

Hace un tiempoYo preguntécómo extender minted para resaltar con color las palabras clave elegidas. El consenso fue "hacer cambios en el programa de pigmentos externos", y así lo hice.

Los cambios son pequeños y el resultado de mi programa de pigmento modificado parece estar bien.Si instalo mi nuevo módulo de pigmento en todo el sistema, mi documento se compila correctamente y los cambios en el resaltado de sintaxis son los esperados.

El problema es que no quiero instalar mi módulo de pigmento de reemplazo en todo el sistema, eso es demasiado invasivo y quiero poder distribuir mi documento para compilarlo en las computadoras de otras personas. Tengo un script bash simple bin/pygmentize.shque invoca la nueva versión de pygmentize como un conjunto de scripts locales.Este script bash es un reemplazo directo probado y funcional para el pygmentizeprograma global.Además, cuando se invoca mediante látex/acuñado en el modo que se muestra a continuación, genera el marcado correcto, pero el documento no se compila.

Aquí hay una comparación del marcado que genera mi pigmentación alterada versus el 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}

Después:

\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 se tomó del directorio de caché acuñado en ambos casos, se generó mediante la invocación de látex de pygmentize, no mi propia invocación manual. (Eliminé el caché acuñado, pasé a usar mi pigmento actualizado y ejecuté pdflatex nuevamente).

La única diferencia entre el marcado generado es que \PYG{n}{printf}esperaría \PYG{n+nf}{printf}que el resto del documento se compilara de la misma manera. No tan

(/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 error ocurre al compilar el marcado anterior. Si estoy leyendo esto correctamente, es el \PYGZshcomando el que no se reconoce. Este error me parece muy extraño: Minted claramente se está cargando y ejecutando, cuanto antes\PYG comando anterioreraSe reconoce como una secuencia de control y el error se manifiesta en una sección de código que no ha cambiado.

Así es como conseguí que se invocara mi pigmentación alterada: hurgando en la fuente acuñada vi esto:

\ifcsname MintedPygmentize\endcsname\else
  \newcommand{\MintedPygmentize}{pygmentize}
\fi

Luego un poco más tarde

\MintedPygmentize\space -l #2 -f latex -P commandprefix=PYG -F tokenmerge (...etc)

Parece que al definir o redefinir \MintedPygmentizedebería poder invocar un programa diferente.

Intenté hacer esto antes de importar acuñado.

\newcommand{\MintedPygmentize}{bash bin/pygmentize.sh}

e intenté hacer esto después de importar acuñado

\renewcommand{\MintedPygmentize}{bash bin/pygmentize.sh}

De cualquier manera se produce el error. He confirmado que bin/pygmentize.shse invoca my y que está recibiendo sus entradas y produciendo sus salidas.

He llegado a la conclusión de que la redefinición \MintedPygmentizeha provocado algunos efectos secundarios de la magia negra.

Entonces, para tener un documento compilable de forma portátil, ¿cómo le digo al paquete acuñado que use mi script externo para generar el marcado de una manera que no cause que aparezcan errores extraños como este?

Respuesta1

La razón por la que \renewcommand{\MintedPygmentize}{bash bin/pygmentize.sh}no funciona para usted se debe a cómo pygmentizese implementa el cheque en Minted.

Esta líneaes lo que ejecuta la verificación en sistemas que no son Windows (por ejemplo, Linux, macOS):

    \immediate\write18{which #1 && touch \jobname.aex}
    \IfFileExists{\jobname.aex}
     {\AppExiststrue
      \DeleteFile{\jobname.aex}}
     {\AppExistsfalse}
  \fi}

Su comando personalizado luego se expande a:

which bash bin/pygmentize.sh && touch \jobname.aex

Que encuentra bash, pero no bin/pygmentize.sh. La solución es hacer bin/pygmentize.shejecutable ( chmod u+x bin/pygmentize.sh) para que whichno devuelva un error o omitir la verificación por completo. Puede omitir la verificación declarando su comando como:

\renewcommand{\MintedPygmentize}{which ; bash bin/pygmentize.sh}

Esto se expandirá a: which which; bash bin/pygmentize.sh && touch \jobname.aexy, por lo tanto, pasará la verificación. En las invocaciones reales, which ;no produce ningún resultado, por lo que toda la invocación del comando se comportará como si esta parte del comando no estuviera allí.

información relacionada