SyncTeX(정방향/역방향 검색)

SyncTeX는 .tex 소스의 한 지점과 완성된 PDF의 일치하는 지점 사이에서 양방향으로 점프할 수 있게 해주는 기계입니다. 커서를 단락에 놓으면 시청자가 해당 단락으로 스크롤합니다. PDF에서 단어를 클릭하면 편집기가 해당 소스 줄로 이동합니다. 긴 문서를 교정할 때 필수입니다. 이 페이지에서는 SyncTeX가 일반적으로 작동하는 방식을 설명합니다. 편집자별 단계는 각 편집자의 자체 페이지에 있습니다.

SyncTeX가 무엇인가요?

TeX는 PDF를 만들기 위해 전체 원고를 한 번에 처리하기 때문에 출력 라인과 그것이 나온 소스의 위치 사이의 링크는 일반적으로 손실됩니다. SyncTeX(TeXnology 동기화)는 해당 대응을 유지하는 기술입니다. Jérôme Laurens가 만들었으며 현재 TeX Live 및 MiKTeX와 함께 제공되는 주요 엔진에 내장되어 있습니다.

그것은 두 가지 방향으로 작동합니다. 소스에서 PDF로 이동하는 것은 정방향 검색(직접 동기화라고도 함)입니다. PDF에서 소스로 다시 이동하는 것은 역검색(또는 역방향/역방향 검색)입니다. 둘 다 편집자와 PDF 뷰어 간의 협력입니다. 편집자는 "이 줄과 열의 출력을 보여주세요" 또는 "이 PDF 좌표가 어느 소스 위치에 매핑되는지"라고 묻고 뷰어나 도우미가 대답합니다.

정방향 및 역방향 검색

정방향 검색(출처 → PDF)은 글을 쓰면서 묻는 질문에 답합니다. "내가 편집하고 있는 부분이 페이지에서 어디에서 끝나게 될까요?" 편집기에 커서를 놓고 정방향 검색 키(또는 "PDF로 이동"과 같은 메뉴 항목)를 누르면 뷰어가 오른쪽 페이지로 스크롤하여 일치하는 장소를 잠시 강조 표시합니다.

역검색(PDF → 소스)은 역검색인데, 교정하면서 빛이 납니다. PDF를 읽고 수정할 부분을 발견하셨나요? 해당 지점(보통 수정자 키 사용)을 클릭하면 일치하는 줄에 커서가 있는 편집기가 맨 앞으로 나옵니다. 요점은 편집할 위치를 찾기 위해 긴 소스를 뒤질 필요가 없다는 것입니다.

내부적으로 명령줄 도구 synctex(SyncTeX와 함께 제공)가 중개를 수행합니다. 정방향 검색은 하위 명령 synctex view에 해당하고 역방향 검색은 synctex edit에 해당합니다. 편집자와 시청자는 이를 호출하거나 이에 상응하는 것을 직접 구현합니다. 일반적으로 이 두 가지를 볼 수는 없지만 두 가지를 직접 실행하는 것은 문제를 격리하는 편리한 방법입니다.

.synctex.gz 파일 및 켜기

이 대응은 엔진이 컴파일 타임에 작성하는 .synctex.gz 파일에 기록됩니다. 내부에는 소스 파일, 행 및 열PDF 페이지 및 그 위의 직사각형(상자) 좌표와 쌍을 이루는 zlib 압축 맵이 있습니다. 이는 동일한 기본 이름과 동일한 폴더(main.texmain.synctex.gz)로 PDF 옆에 있습니다. 이 파일이 존재할 때까지는 정방향 검색이나 역방향 검색이 작동하지 않습니다.

이를 생성하려면 컴파일할 때 -synctex=1를 전달합니다(LuaTeX는 긴 형식 --synctex=1를 사용함). 손으로 보면 이런 느낌입니다. 모든 빌드에 필요하므로 실제로는 편집기나 빌드 도구에 한 번 설정된 채로 두십시오.

terminal
pdflatex -synctex=1 main.tex
xelatex  -synctex=1 main.tex
lualatex --synctex=1 main.tex

값은 비트로 읽혀집니다. 1는 gzip으로 압축된 .synctex.gz를 제공합니다. -1는 압축되지 않은 일반 .synctex를 제공합니다(내부를 엿보거나 디버깅할 때 유용함). 명령줄 대신 TeX 기본 \synctex=1를 사용하여 소스 상단에서 이를 켤 수도 있습니다.

빌드 도구도 다르지 않습니다. latexmk를 사용하여 -synctex=1.latexmkrc의 컴파일 명령에 넣습니다. 지속적인 미리보기(-pvc)와 결합되어 모든 저장은 재컴파일 및 미리보기 새로고침을 트리거하므로 정방향 및 역방향 검색은 항상 최신 .synctex.gz에서 작동합니다.

latex
$pdf_mode = 1;
$pdflatex = 'pdflatex -synctex=1 -interaction=nonstopmode %O %S';
# clean up the SyncTeX file too
@generated_exts = (@generated_exts, 'synctex.gz');

엔진 및 DVI 경로(pLaTeX / upLaTeX)

PDF를 직접 내보내는 엔진(pdfTeX, XeTeX 및 LuaTeX)은 모두 -synctex를 이해하고 .synctex.gz 자체를 작성합니다. pdfLaTeX, XeLaTeX 및 LuaLaTeX도 마찬가지입니다. 지금까지는 매우 간단했습니다.

일본어의 중심인 pLaTeX / upLaTeX는 2단계 파이프라인입니다. 먼저 DVI 파일을 내보내고 dvipdfmx가 PDF로 변환됩니다. 여기서도 -synctex=1엔진(platex / uplatex)에 전달합니다. 엔진은 먼저 DVI 좌표.synctex.gz를 작성합니다. 하지만 DVI 좌표와 final-PDF 좌표는 오프셋과 배율 dvipdfmx가 적용되므로 변환 후 간격을 조정해야 합니다.

마무리 작업은 synctex 하위 명령 synctex update입니다. 이 명령의 작업은 "dvi/xdv → pdf 필터가 적용된 후 SyncTeX 파일을 업데이트하는 것"입니다. dvipdfmx 자체에는 -synctex 옵션이 없습니다. 대신 변환에 사용된 배율과 수평/수직 오프셋(-m / -x / -y, 필터에 전달된 동일한 값)을 synctex update에 전달하여 좌표가 정렬되도록 합니다. 실제로 ptex2pdf 또는 latexmk와 같은 상위 수준 도구가 이 전체 체인을 실행합니다.

각 편집자가 이를 트리거하는 방법

SyncTeX 자체가 공통 기반입니다. 정방향 및 역방향 검색을 실행하는 키나 클릭만 편집자와 뷰어 간에 다릅니다. 대표적인 조합은 다음과 같습니다(전체 설정은 각 페이지 참조). Adobe Acrobat / Reader와 같이 SyncTeX를 지원하지 않는 뷰어는 역검색을 수행할 수 없습니다. 일반적인 선택은 Skim(macOS), SumatraPDF(Windows) 및 Okular(Linux)입니다.

Editor (뷰어)앞으로 (출처→PDF)역(PDF→소스)
TeXShop / Skim미리보기에서 Cmd를 누른 채 클릭하세요PDF에서 Shift-Cmd를 누른 채 클릭
TeXstudioCtrl 키를 누른 채 클릭하거나 “PDF로 이동”Ctrl 키를 누른 채 클릭하거나 '소스로 이동'
VS Code (LaTeX Workshop)Ctrl/Cmd+Alt+JViewer 특정(예: Okular에서 Shift 클릭)

정밀도에 대한 마지막 말씀입니다. SyncTeX는 조판된 "상자"의 세분성으로 매핑되므로 일반 본문 텍스트에서는 점프가 충분히 정확합니다. 하지만 TikZ 사진 내부, 복잡한 매크로의 확장 또는 테이블 내부에서는 일치 항목이 가까운 상자로 반올림되어 대상에서 한두 단어를 벗어날 수 있습니다. 이는 버그가 아니라 접근 방식의 제한 사항입니다.

SyncTeX를 사용한 교정 루프

SyncTeX는 단순한 설정이 아닙니다. 그것은 교정 습관입니다. PDF 제출 전 최종 패스에서 PDF에서 의심스러운 단어를 클릭하여 소스로 돌아가 원고를 편집하고 저장 및 재구성한 다음 정방향 검색을 사용하여 수정된 지점으로 돌아갑니다. 이 SyncTeX 교정 루프가 실패하면 .synctex.gz가 PDF 옆에 있는지, 빌드가 -synctex=1를 사용했는지, 뷰어가 편집기를 호출하는 명령을 실행할 수 있는지 순서대로 확인하세요.

.synctex.gz 파일은 제출물도 아니고 기록 소스도 아닙니다. 재생 가능한 작업 맵입니다. 일반적으로 Git에서는 이를 무시하고 PDF 또는 소스 경로의 이름이 바뀔 때마다 오래된 것으로 의심합니다. 한 단어 오프셋은 상자 수준 매핑의 제한일 수 있지만 완전히 다른 파일로 이동하는 것은 일반적으로 오래된 출력이나 잘못된 마스터 파일을 의미합니다.