EDRSPIHCRSSRSS

MiKTeXDockerized

Difference between r1.20 and the current

@@ -61,7 +61,8 @@
--name <unique_name> \
-v miktex:/miktex/.miktex \
-v <working_dir>:/miktex/work \
miktex/miktex
miktex/miktex \
/bin/bash
}}}
* ```<unique_name>```은 기억하기 쉬운 container 이름으로. (이하 ```mymiktex```으로 예를 들 것임.)
* ```<working_dir>```는 host측 작업 디렉토리. Windows라면 ```C:/MyTeXWork```과 같은 방법으로 지정한다.



1. 장점과 단점

1.1. 장점

  1. MiKTeX 특유의 MPM 시스템 덕분에 작은 크기의 이미지만 설치하고도 이후의 작업에 지장이 없다. 패키지나 유틸리티가 필요해지면 스스로 다운로드받는다.
  2. 현재 MiKTeX (21.X)은 갱신이 빠르고 상당히 안정적이다. TeX Live와 큰 차이가 없다.
  3. texmf를 추가하여 운영할 수 있기 때문에 사용자 패키지를 활용하는 것이 가능하다. (KTUG 사설저장소 패키지들을 미리 설치해둔 후에 등록하여 쓸 수 있다.)
  4. Linux MiKTeX은 실행 속도에서도 만족스럽다.
  5. 호스트 운영체제가 무엇이든 상관없이 동일하게 동작한다.
  6. docker에서 돌아간다는 것이 장점이다.

1.2. 단점

  1. tlmgr이 없는 것은 단점이다. 그 결과 KTUG 사설저장소를 통합적으로 운용하지 못한다.
  2. MPM 다운로드가 서버 사정으로 동작하지 않을 가능성을 배제할 수 없다.
  3. docker에서 돌아간다는 것이 단점이다.
    • Microsoft Windows는 docker를 돌리기 위해서 WSL2를 동작시킬 것이고, WSL2는 Hyper-V를 동작시킬 것이다. 이 경우 VMware, VirualPC등이 실행되지 않거나, 실행되더라도 자체 VM를 사용하지 못하고 Hyper-V에서 실행되므로 실행 속도등에서 손실이 많다고 알려져 있다.

2. Docker 설치

2.1. Windows: WSL2 + Docker Desktop

  • VM Windows의 경우에는 WSL2를 쓸 수 없는 것 같다. Docker는 WSL2를 권장한다.

2.1.1. WSL 설정

2.1.2. Docker Desktop 설치

2.2. Mac OS

2.3. Linux: Ubuntu

  • apt로 설치한다.
    # apt install docker.io
    

3. miktex/miktex

3.1. docker image pull

  • miktex docker image
    docker pull miktex/miktex
    
    • miktex/miktex이 ARM 아키텍처를 제공하지 않는 듯한데, M1 Mac에서 Rosetta2로 어찌어찌 되는지 어떤지 해보지 않아서 모릅니다. 시도해보신 분은 추가바람.
  • miktex이라는 이름의 volume을 만든다.
    docker volume create --name miktex
    

3.2. execute without container

  • 다음 명령 예시의 \는 다음 줄과 이어진다는 표시이다.
  • $(pwd)는 Linux나 Mac에서라면 이대로 입력해도 현재 폴더로 되지만 Windows에서는 현재 폴더의 절대경로를 디렉터리 구분자를 /로 하여 적어주어야 한다. 예를 들면 -v C:/Users/tester/Documents/dockerwork:/miktex/work.
    docker run -ti --rm \
          -v miktex:/miktex/.miktex \
          -v $(pwd):/miktex/work \
          miktex/miktex pdflatex <filename> 

3.3. container

  • build container
    docker run -ti \
      --name <unique_name> \
      -v miktex:/miktex/.miktex \
      -v <working_dir>:/miktex/work \
      miktex/miktex \
      /bin/bash
    
    • <unique_name>은 기억하기 쉬운 container 이름으로. (이하 mymiktex으로 예를 들 것임.)
    • <working_dir>는 host측 작업 디렉토리. Windows라면 C:/MyTeXWork과 같은 방법으로 지정한다.
  • starting/stopping container
    docker start mymiktex
    docker stop mymiktex
    
  • executing container
    docker exec -ti mymiktex /bin/bash
    
    • /bin/bash를 실행하면 docker container 시스템 내부의 bash가 열린다. 이 시스템은 Debian Linux이다.
    • /bin/bash 대신 컴파일 명령을 줄 수 있다. ex) docker exec -ti mymiktex xelatex --shell-escape --synctex=1 mytex.tex

4. novadehi/miktexwktug

  • 소개글
  • Dockerized MiKTeXKTUG Private Repository의 주요 패키지들과 미리 설정된 Emacs + Okular 작업 환경을 추가한 개인 배포 버전.
    • cli 태그가 붙은 버전은 GUI App인 Emacs와 Okular를 제외하고 MiKTeX과 한글 및 유틸리티 설정만을 한 것이다. X11을 실행할 수 없는 환경에서는 이것을 TeX 시스템으로 활용할 수 있다.
  • Windows 11, Linux, Mac OS에서 실행 가능하다.
    • Windows 11 (22000+) 조건은 Gui App 실행에 필요한 조건이다. 이를 충족하지 않는 경우에도 docker 설치 실행이 가능하다면 cli 버전을 쓸 수 있다.
  • Apple Silicon Mac을 위한 arm64 플랫폼의 MikTeX binary가 (아직) 없기 때문에 --platform linux/amd64 옵션을 주어서 (로제타를 경유하여) 실행하여야 한다. DeleteMe 확인요망.
  • 별도로 TeX 시스템과 에디터를 설치할 필요 없이 이 도커 이미지 하나로 TeX 사용환경을 설정할 수 있다.
    • Workflow 자동화 프로그램은 latexmk, spix, cluttex, texify 등이 있다. arara는 jre가 설치되어 있지 않기 때문에(용량문제로) 사용할 수 없다. cluttex의 경우 clxelatex과 같은 단축 명령은 제공하지 않는다. cluttex -e xelatex과 같이 사용하여야 한다. latexmk 또는 spix를 권장함.
      • arara가 꼭 필요하면 container를 만들어서 apt install default-jre 명령을 한 번 준다. 이 container를 commit하여 사용할 수 있다.
      • 참고: cli 버전은 java가 동작하므로 arara를 쓸 수 있다.
    • pygments는 설치되어 있다. minted 사용 가능함.
    • 한글 폰트는 함초롬LVT와 나눔글꼴(사설저장소 제공 글꼴) 및 Noto CJK KR. 다른 폰트가 필요하면 host computer의 폰트 폴더를 volume 옵션(-v)으로 /root/.fonts 아래 디렉터리로 연결하여 사용한다.
    • Emacs의 한영 전환은 C-\ 이외에 Shift-SPC.
    • Emacs에서 View를 열려면 C-c C-c, 또는 C-c C-a. Okular에서 Inverse Search는 "Browse" 도구 상태에서 Shift+Click.
    • Emacs 내부에서 ShellEscape 해야 한다면 M-x customize-variable RET TeX-command-extra-options RET로 편집창을 연 상태에서 -shell-escape를 추가하고 Apply.

4.1. 사용법

4.1.1. 공통

아래 docker 명령은 (시스템 설정에 따라) sudo를 필요로 할 수 있음.
  1. 시작하기:
    $ docker pull novadehi/miktexwktug
    
    • 또는 cli 버전
      $ docker pull novadehimiktexwktug:cli
      
  2. 볼륨 만들기 (처음 한 번만 하면 되고 볼륨은 docker로 관리 가능)
    $ docker volume create --name miktex
    
  3. 컴파일 명령으로 실행 (xelatex)
    $ docker -v miktex:/miktex/.miktex -v $(pwd):/miktex/work novadehi/miktexwktug xelatex <filename>.tex
    

4.2. GUI 프로그램(Emacs) 실행

4.2.1. Windows

  1. GUI 프로그램은 wsl 명령행에서 실행한다.
    # docker run -ti --rm \
       -v miktex:/miktex/.miktex \
       -v $(pwd):/miktex/work \
       -e DISPLAY=:0 \
       -v /tmp/.X11-unix:/tmp/.X11-unix \
       novadehi/miktexwktug emacs
    
  2. 윈도우즈 시스템 폰트를 컴파일에 사용하려면 다음 행을 추가한다. (wsl 명령행 기준)
    -v /mnt/c/Windows/Fonts:/root/.fonts/winfonts
    
  3. GUI Emacs 없이 컴파일러로만 사용하려면 cmd 명령행에서도 가능하다. 다만 $(pwd) 대신 현재 작업 디렉터리를 다음과 같은 형식으로 지정.
     -v C:/Users/myname/Documents/texwork:/miktex/work
    
    • GUI 없이 컴파일러로만 사용하는 경우 현재 폴더를 -v 옵션으로 지정하는 귀찮은 문제를 간단히 하는 배치파일이 작성되어 있다. 위의 소개글에 딸린 댓글의 첨부파일 참조.

4.2.2. Mac OS

  1. XQuartz를 설치하고 Preferences에서 Security -> Allow connections from network clients 체크
  2. terminal에서 다음 명령을 한 번 실행
    # xhost + localhost
    
  3. Emacs를 실행하는 명령
    # docker run -ti --rm \
     -v miktex:/miktex/.miktex \
     -v $(pwd):/miktex/work \
     -e DISPLAY=host.docker.internal:0 \
     -v /tmp/.X11-unix:/tmp/.X11-unix \
     novadehi/miktexwktug emacs
    
    • /tmp/.X11-unix 부분은 없어도 된다.

4.2.3. Linux

  1. GUI를 위하여 다음 명령을 미리 실행해둔다.
    # xhost local:root
    
  2. Emacs 실행
    # docker run -ti --rm \
     -v miktex:/miktex/.miktex \
     -v $(pwd):/miktex/work \
     -e DISPLAY
     -v /tmp/.X11-unix:/tmp/.X11-unix \
     novadehi/miktexwktug emacs
    

5. Docker 운영 팁

  • Windows는 Pro면 Hyper-V, Home이면 wsl2로 사용하는 것을 추천함.

5.1. Docker daemon 실행 방법

  • Windows, Mac OS에서는 Docker Desktop을 이용하는 것이 제일 쉽다.
  • OpenSUSE의 경우, 다음과 같이.
    sudo systemctl start docker
    
  • Ubuntu에서는
    sudo service docker start
    

5.2. 사용자에게 docker 그룹 권한 주기 (Linux)

sudo usermod -G docker -a <username>
  • 생성되는 파일의 권한 문제 (Linux)
     --user "$(id -u):$(id -g)"