
~ 안에latexdiff
의 경우 기본값은 \mbox
기본 스타일로 올바르게 인쇄되도록 인용 명령을 보호하는 것입니다. 또는 \mbox
등 으로 보호할 다른 명령을 추가하려면 어떻게 해야 합니까 ?\SI{}{}
\cref{}
new.tex
% arara: pdflatexmk
\documentclass{article}
\usepackage{siunitx}
\begin{document}
This is the new text \SI{300}{\meter\per\second}
\end{document}
old.tex
% arara: pdflatexmk
\documentclass{article}
\usepackage{siunitx}
\begin{document}
This is the old text \SI{600}{\meter\per\second}
\end{document}
출력 latexdiff --append-safecmd="SI"
(컴파일은 실패하지만 명령 \mbox
주위에 추가는 siunitx
성공):
% arara: pdflatexmk
%DIF LATEXDIFF DIFFERENCE FILE
%DIF DEL test_old.tex Sun Dec 21 11:40:33 2014
%DIF ADD test.tex Sun Dec 21 11:40:38 2014
\documentclass{article}
\usepackage{siunitx}
%DIF PREAMBLE EXTENSION ADDED BY LATEXDIFF
%DIF UNDERLINE PREAMBLE %DIF PREAMBLE
\RequirePackage[normalem]{ulem} %DIF PREAMBLE
\RequirePackage{color}\definecolor{RED}{rgb}{1,0,0}\definecolor{BLUE}{rgb}{0,0,1} %DIF PREAMBLE
\providecommand{\DIFadd}[1]{{\protect\color{blue}\uwave{#1}}} %DIF PREAMBLE
\providecommand{\DIFdel}[1]{{\protect\color{red}\sout{#1}}} %DIF PREAMBLE
%DIF SAFE PREAMBLE %DIF PREAMBLE
\providecommand{\DIFaddbegin}{} %DIF PREAMBLE
\providecommand{\DIFaddend}{} %DIF PREAMBLE
\providecommand{\DIFdelbegin}{} %DIF PREAMBLE
\providecommand{\DIFdelend}{} %DIF PREAMBLE
%DIF FLOATSAFE PREAMBLE %DIF PREAMBLE
\providecommand{\DIFaddFL}[1]{\DIFadd{#1}} %DIF PREAMBLE
\providecommand{\DIFdelFL}[1]{\DIFdel{#1}} %DIF PREAMBLE
\providecommand{\DIFaddbeginFL}{} %DIF PREAMBLE
\providecommand{\DIFaddendFL}{} %DIF PREAMBLE
\providecommand{\DIFdelbeginFL}{} %DIF PREAMBLE
\providecommand{\DIFdelendFL}{} %DIF PREAMBLE
%DIF END PREAMBLE EXTENSION ADDED BY LATEXDIFF
\begin{document}
This is the \DIFdelbegin \DIFdel{old text \SI{600}{\meter\per\second}
}\DIFdelend \DIFaddbegin \DIFadd{new text \SI{300}{\meter\per\second}
}\DIFaddend\end{document}
답변1
다음 옵션에 정의된 경우 다른 명령은 인용 명령과 동일하게 처리됩니다.
--append-mboxsafecmd="cmd1,cmd2,..."
(latexdiff 버전 1.1.0 이상이 필요함). siunitx 패키지가 감지되면 에 대해 자동으로 수행됩니다 \SI
.
답변2
이 작업을 수행하는 쉬운 방법은 없습니다. 인용 명령은 현재(1.0.4) 하드 코딩되어 있습니다. 이 목록에 \cref를 포함하려면 latexdiff의 소스 코드를 수정해야 합니다. 코드에서 다음 줄을 찾으세요.
if ( defined $packages{"apacite"} ) {
print STDERR "DEBUG apacite citation commands\n" if $debug;
$citpatsafe=qr/^(?:mask)?(?:full|short)?cite(?:A|author|year)?(?:NP)?$/;
$citpat='(?:mask)?(?:full|short|no)?cite(?:A|author|year|meta)?(?:NP)?';
} else {
# citation command pattern for all other citation schemes
$citpatsafe=qr/^cite.*$/;
$citpat='(?:cite\w*|nocite)';
};
else 절의 행을 다음으로 변경하십시오.
$citpatsafe=qr/^(?:cite.*|cref)$/;
$citpat='(?:cite\w*|nocite|cref)';
(테스트되지 않았지만 작동해야 함) \SI의 경우 알고리즘은 '인용' 명령에 선택사항이 아닌 인수가 정확히 하나만 있을 것으로 예상하므로 이는 작동하지 않습니다.
인용 명령의 문제는 ulem 패키지와의 비호환성으로 인해 발생하며 siunitx에서도 마찬가지일 수 있습니다. 해결 방법으로 다른 마크업 스타일(예: CFONT, 옵션 -t CFONT)을 시도한 다음 \SI,\cref를 안전한 명령으로 정의하는 것이 좋습니다.
매우 지저분한 해결 방법으로 \SI 명령을 보호하기 위해 latex/pdflatex에 공급하기 전에 다음 한 줄을 사용하여 latexdiff 출력을 사후 처리합니다.
perl -pne 's/\\SI\{(.*?)}{(.*?)\}/\\mbox{\\SI{$1}{$2}}/g' file-diff.tex > file-diff-mod.tex
이는 추가되거나 삭제된 블록 외부의 인스턴스를 포함하여 \SI의 모든 인스턴스를 \mbox 명령으로 묶습니다. 또한 \SI 명령에 대한 인수가 중첩된 경우, 즉 중괄호가 포함된 경우 또는 SI 인수 사이에 공백이나 개행 문자가 있는 경우 오류가 발생합니다.
답변3
해킹으로 LaTeX 끝에서 이 문제를 해결할 수 있습니다.
\makeatletter
\AtBeginDocument{
\let\UL@SI\SI
\renewcommand\SI[3][]{\mbox{\UL@SI[#1]{#2}{#3}}}
}
\makeatother
이는 대부분의 '간단한' 경우에 작동합니다.