![Latexdiff с подфайлами](https://rvso.com/image/286963/Latexdiff%20%D1%81%20%D0%BF%D0%BE%D0%B4%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D0%BC%D0%B8.png)
Есть ли способ заставить latexdiff работать с пакетом «subfiles»?
Я использую подфайлы для включения частей документа из разных .tex-файлов. Latexdiff, похоже, не отмечает изменения в подфайлах.
Опция --flatten не помогает. Версия Latexdiff — 1.0.2.
Пример :
основной.текс
\documentclass[10pt]{article}
\usepackage{subfiles}
\begin{document}
\subfile{includeme.tex}
\end{document}
включить меня.tex
\documentclass[main.tex]{subfiles}
\begin{document}
Text!
\end{document}
Бег
latexdiff d1/main.tex d2/main.tex --flatten > mydiff.tex
полученный документ просто не включает содержимое подфайла.
mydiff.tex
\documentclass[10pt]{article}
%DIF LATEXDIFF DIFFERENCE FILE
%DIF (...)
%DIF END PREAMBLE EXTENSION ADDED BY LATEXDIFF
\begin{document}
\subfile{includeme.tex}
\end{document}
Итак, да, проблема заключается в конвейере/рабочем процессе Flatten, который, похоже, не предназначен для работы с включениями \subfile{includeme.tex}.
решение1
Обратите внимание, что следующее — это обходной путь, а не полное решение:
latexdiff --append-safecmd=subfile d1/main.tex d2/main.tex --flatten > mydiff.tex
позаботится о случаях, когда команда \subfile была добавлена или удалена из файла, и весь блок размечен (проверено только на MWE, необходимо подтвердить для более длинного включенного материала), или имя файла включенного файла изменяется. Вам все равно нужно будет скопировать включенные файлы в каталог, где генерируется файл различий (текущий каталог в MWE).
Чтобы выделить изменения содержимого в подфайлах, вы можете обрабатывать каждый файл отдельно.
cat /dev/null > null latexdiff -pnull d1/includeme.tex d2/includeme.tex > includeme.tex
Опция -p заставляет latexdiff опускать команды преамбулы, которые он обычно вставляет автоматически при обнаружении \begin{document} (необходим вспомогательный файл "null", поскольку -p/dev/null не распознается из-за ошибки в latexdiff).
Теперь осталось только автоматизировать это. Следующая строка — это хакерский способ добиться некоторой автоматизации в качестве доказательства концепции, но ее действительно нужно будет расширить до более надежного и гибкого небольшого скрипта оболочки:
grep -v '^%' main.tex | grep subfile\{ | sed 's/^.*subfile{\(.*\)}.*$/\1/' \ | awk '{ print "latexdiff -pnull d1/" $1, "d2/" $1,">", $1 }' | sh
решение2
Прошло 2 года с тех пор, как был задан вопрос, но я в итоге написал пакетный файл для решения этой проблемы в среде Windows:
@echo off
setlocal
set "old_path=..\..\tags\old_version\my_folder\"
set "new_path=..\..\..\trunk\my_folder\"
set "doc_name=my_file.tex"
latexdiff --flatten %doc_name% %doc_name% > flat.tex
cd %old_path%
latexdiff --flatten %doc_name% %doc_name% > flat.tex
cd %new_path%
latexdiff --flatten %old_path%flat.tex flat.tex > diff.tex
rm flat.tex
rm %old_path%flat.tex
решение3
Пост вышесвязьбыло очень полезно, но я сделал свою модифицированную версию, которую вы можете использовать.
@echo off
setlocal
set "old_path=..\documentation\"
set "new_path=..\documentation_old\"
set "doc_name_filename=main"
echo Generate %doc_name_filename%_flat.tex for %new_path%
cd %new_path%
latexpand %doc_name_filename%.tex > %doc_name_filename%_flat.tex
echo Generate %doc_name_filename%_flat.tex for %old_path%
cd %old_path%
latexpand %doc_name_filename%.tex > %doc_name_filename%_flat.tex
echo Generate diff
cd %new_path%
latexdiff %old_path%%doc_name_filename%_flat.tex %doc_name_filename%_flat.tex > diff.tex
pdflatex --max-print-line=10000 -shell-escape -synctex=1 -interaction=nonstopmode -file-line-error -recorder diff.tex 2>&1 > NUL
echo PDF generated in case of problems see diff.log
echo Cleaning up
del %doc_name_filename%_flat.tex
del %old_path%%doc_name_filename%_flat.tex
pause