
얼마 전에나는 물었다내가 선택한 핵심 단어를 색상 강조 표시하도록 minted를 확장하는 방법. 합의는 "외부 피그먼트 프로그램을 변경하라"는 것이었습니다. 그래서 저는 그렇게 했습니다.
변경 사항은 작으며 수정된 pygment 프로그램의 출력은 괜찮은 것 같습니다.새 피그먼트 모듈을 시스템 전체에 설치하면 문서가 올바르게 컴파일되고 구문 강조 표시가 예상대로 변경됩니다.
문제는 교체용 피그먼트 모듈을 시스템 전체에 설치하고 싶지 않다는 것입니다. 이는 너무 침해적이며 다른 사람의 컴퓨터에서 컴파일하기 위해 내 문서를 배포할 수 있기를 원합니다. 나는 bin/pygmentize.sh
로컬 스크립트 세트로 pygmentize의 새 버전을 호출하는 간단한 bash 스크립트를 가지고 있습니다 .이 bash 스크립트는 글로벌 프로그램에 대한 테스트를 거쳐 작동하는 드롭인 대체품입니다 pygmentize
.또한 아래 표시된 mannar에서 latex/minted를 통해 호출하면 올바른 마크업이 생성되지만 문서가 컴파일되지 않습니다.
다음은 변경된 pygmentize가 생성한 마크업과 원본을 비교한 것입니다.
전에:
\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}
후에:
\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}
pygmentize
이 코드는 두 경우 모두 발행된 캐시 디렉토리에서 가져왔고, 제가 직접 호출한 것이 아니라 라텍스의 호출을 통해 생성되었습니다 . (만들어진 캐시를 삭제하고 업데이트된 피그먼트를 사용하도록 전환한 후 pdflatex를 다시 실행했습니다.)
생성된 마크업 간의 유일한 차이점은 문서의 나머지 부분도 동일한 방식으로 컴파일될 것으로 예상된다는 점 \PYG{n}{printf}
입니다 . \PYG{n+nf}{printf}
별로
(/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!
이 오류는 위의 마크업 부분을 컴파일할 때 발생합니다. 이것을 올바르게 읽고 있다면 \PYGZsh
인식되지 않는 명령입니다. 이 오류는 매우 이상하다고 생각합니다. Minted는 분명히 로드되고 실행 중입니다. 이전 \PYG
명령은~였다제어 시퀀스로 인식되며 변경되지 않은 코드 섹션에 오류가 나타납니다.
변경된 피그멘타이즈를 호출하는 방법은 다음과 같습니다. 생성된 소스를 살펴보니 다음과 같습니다.
\ifcsname MintedPygmentize\endcsname\else
\newcommand{\MintedPygmentize}{pygmentize}
\fi
그러다가 조금 후에
\MintedPygmentize\space -l #2 -f latex -P commandprefix=PYG -F tokenmerge (...etc)
\MintedPygmentize
정의하거나 재정의함으로써 다른 프로그램을 호출할 수 있어야 하는 것 같습니다 .
민트를 수입하기 전에 이것을 시도했습니다
\newcommand{\MintedPygmentize}{bash bin/pygmentize.sh}
그리고 Minted를 가져온 후에 이 작업을 시도했습니다.
\renewcommand{\MintedPygmentize}{bash bin/pygmentize.sh}
어느 쪽이든 라운드하면 오류가 발생합니다. my 가 bin/pygmentize.sh
호출되어 입력을 받고 출력을 생성하고 있음을 확인했습니다 .
\MintedPygmentize
나는 재정의로 인해 흑마법의 부작용이 발생했다고 결론을 내렸습니다 .
그렇다면 이식 가능하게 컴파일 가능한 문서를 가지려면 생성된 패키지에 외부 스크립트를 사용하여 이와 같은 이상한 오류가 발생하지 않는 방식으로 마크업을 생성하도록 어떻게 지시해야 할까요?
답변1
당신에게 효과가 없는 이유는 Minted에서 수표가 구현되는 \renewcommand{\MintedPygmentize}{bash bin/pygmentize.sh}
방식 때문입니다 .pygmentize
이 줄Windows가 아닌 시스템(예: Linux, macOS)에서 검사를 실행하는 항목은 다음과 같습니다.
\immediate\write18{which #1 && touch \jobname.aex}
\IfFileExists{\jobname.aex}
{\AppExiststrue
\DeleteFile{\jobname.aex}}
{\AppExistsfalse}
\fi}
그러면 사용자 정의 명령이 다음으로 확장됩니다.
which bash bin/pygmentize.sh && touch \jobname.aex
bash는 찾지만 bin/pygmentize.sh
. 해결책은 오류를 반환하지 않도록 bin/pygmentize.sh
실행 파일( chmod u+x bin/pygmentize.sh
) 을 만들 which
거나 검사를 완전히 우회하는 것입니다. 다음과 같이 명령을 선언하여 검사를 우회할 수 있습니다.
\renewcommand{\MintedPygmentize}{which ; bash bin/pygmentize.sh}
이는 다음으로 확장되어 which which; bash bin/pygmentize.sh && touch \jobname.aex
검사를 통과하게 됩니다. 실제 호출에서는 which ;
출력을 생성하지 않으므로 전체 명령 호출은 명령의 이 부분이 없는 것처럼 동작합니다.