LuaLaTeX : CI의 ToC, Index, Bibliography, Glossary 및 기타를위한 다중 컴파일 자동화

Aug 18 2020

원격 CI 시스템에서 재현 가능하고 안정적인 문서 빌드를 갖기 위해 완전한 문서를 생성하는 데 필요한 모든 명령 줄 도구와 여러 컴파일을 자동화하고 싶습니다. 이 파이프 라인은 문서에서 실제로 사용되는 플러그인에 관계없이 모든 문서에서 즉시 작동해야합니다.

LaTeX 빌드가 필요한 모든 단계를 자동으로 수행하는 방법이 있다는 것을 알고 있지만 지금까지는 어떤 접근 방식으로도 성공하지 못했습니다.

세부

내 현재 설정은 다음과 같습니다.

  • 문서는 LuaLaTeX 및 MiKTeX를 사용하여 내 컴퓨터에서 작성되고 컴파일됩니다.
  • CI는 모든 사용자 지정 글꼴 및 리소스가 설치된 MiKTeX Docker 이미지 ( 여기 참조 )로 구성됩니다.

문서 작성자로서 알아야 할 문서를 컴파일하기 위해 로컬에서 다양한 작업을 순서대로 수행해야합니다. 그러나 CI는 문서 별 특수 설정을 적용하지 않고 모든 문서를 작성할 수 있어야하며 문서가 올바르게 컴파일되지 않거나 누락 된 경우 오류가 발생합니다.

예 : 용어집

glossaries패키지를 사용하는 문서를 빌드해야 할 때 로컬 빌드는 다음과 같습니다.

lualatex doc.tex
makeglossaries doc
lualatex doc.tex

이제 CI는 문서에이 단계가 필요한지 여부를 알지 못하지만 문서를 빌드 할 수 있어야합니다. 용어집 문서에는 모든 것을 한 번에 컴파일 할 수 있다고 가정 한 문서 컴파일 옵션 automake과 매개 변수에 대한 언급 --shell-escape이 있지만 CI에서는 작동하지 않습니다. 마찬가지로 ToC, 색인, 참고 문헌 등에 동일한 문제가 있습니다.

요약

여러 패키지에 대해 복잡한 컴파일을 자동화하는 일반적인 방법이 있습니까? (LuaLaTeX 또는 일부 사용자 지정 범용 스크립트에 내장 됨)

모든 단계가 자동으로 수행되지 않도록하는 설정에 문제가 있습니까?

특정 패키지 또는 일반적으로 LaTeX에 대한 많은 리소스를 검토했지만 작동하는 것을 찾을 수 없었습니다. 귀하의 도움에 감사드립니다.

답변

3 AlexPovel Oct 08 2020 at 19:01

다른 사람과 자신이 언급 latexmk했듯이이 작업에 적합한 도구 인 것 같습니다. 구현 방법을 알아보기 위해 내 자신의 LaTeX 문서 / 템플릿 CI 파이프 라인 (GitLab)에서 관련 비트를 강조하겠습니다. 이것은 "다른 패키지에 대한 복잡한 컴파일"에 사용할 수있는 예제 여야합니다. 나는 첨부로 이동합니다 Dockerfile및 GitLab CI의 설정 텍 별 /뿐만 아니라,뿐만 아니라 latexmk모든 부분이 밀접하게 결합되어 있기 때문에, 부분.

아래에 자세히 설명 된 모든 것이이 프로젝트에서 구현되고 작업하는 것을 볼 수 있습니다 . 나는이 대답을 가능한 한 독립적으로 유지하려고 노력하고 있습니다. 프로젝트에 대한 링크에는 최신 상태가 포함되며 결국이 답변을 대체합니다.


LaTeX 및 배포 (Debian) 패키지

연결된 파이프 라인에는 설정시 특별한주의가 필요한 몇 가지 패키지가 있습니다. 당신이 똑같은 요구 사항을 가질 것 같지는 않지만, 여기에 그것들을 완전하게 나열하고 있습니다.

  1. glossaries-extra을 (를) 기반으로 빌드 glossaries하려면 작업 할 파일 bib2gls을 변환하고 처리 해야 합니다 .*.biblualatex

    이것은 설정에 두 가지로 반영됩니다.

    1. Docker 이미지에는에 대한 Java Runtime Environment가 필요합니다 bib2gls.
    2. latexmkbib2gls파일 의 존재에 대해 알려야 합니다.
  2. pgfplots그와 contour의 옵션 \addplot3( 예 ) 외부 필요로 gnuplot프로그램을. 다시 말하지만 이것은 두 가지로 반영됩니다.

    1. lualatex(또는 선택한 엔진) 읽기 gnuplotpgfplots위해 계산 결과를 파일에 쓰기 위해 외부 쓰기 액세스 --shell-escape가 필요합니다 latexmk.
    2. gnuplot, 예 apt-get install gnuplot를 들어 Debian 호스트에 배포 패키지 (LaTeX 패키지와 반대)가 있어야합니다 .
  3. LaTeX는 기본적으로 *.svg파일을 포함 할 수 없습니다 . 이러한 파일을 포함하려면 먼저 PDF (또는 다른 포함 가능한 형식)로 변환해야합니다. 이것은 Inkscape 와 그 *.pdf_tex루틴을 사용하여 달성 할 수 있습니다 . 그러나 이로 인해 SVG 파일 당 두 개의 추가 파일 ( *.pdf*.pdf_tex. SVG 파일이 변경 될 때마다 파생 파일을 업데이트해야합니다. 이로 인해 버전 관리 git등 의 맥락에서 잠재적 충돌이 발생합니다 . 어떤 버전을 보관해야합니까?

    svgLaTeX의 패키지는 변환 프로세스를 자동화하여 이러한 문제를 해결합니다. 생성 된 파일 *.pdf*.pdf_tex파일은 임시 / 파생 파일로 취급하여 자유롭게 버릴 수 있습니다. 단일 소스 로 SVG 만 남아 있습니다 . 보너스로 텍스트 기반 (XML) 이기 때문에 VCS git(이진 PDF가 실제로는 아님) 와 같은 VCS에도 적합합니다 .

    이전과 마찬가지로 아래 설정에 두 위치에 반영됩니다.

    1. CLI를 호출하는 inkscape(GUI를 반대로이에 대한 작업에, inkscape당신에 있어야한다 $PATH, 읽기, 쓰기의 경우), 텍 엔진이 필요합니다 --shell-escape.
    2. inkscape 빌드 환경 (Docker 이미지)에서 사용할 수 있어야합니다.
  4. tcolorbox및 \newtcolorbox명령을 사용하여 예제에 대한 새 환경을 만들었습니다 .

    \newtcolorbox[%
      auto counter,%
      number within=chapter,%
      % Set cleveref, see https://tex.stackexchange.com/a/126023/120853:
      crefname={Example}{Examples},
      % List of Examples. *.loe file ending could clash with package thmtools,
      % careful if that is used!
      list inside=loe,
    ]{example}% Name of environment itself
        [2]% Number of arguments for the environment
        []% Default of optional argument, which is the first one. Use it for label
        {%
            beforeafter skip=18pt plus 4pt minus 4pt,%
            width=0.95\linewidth,%
            % Center box; see https://tex.stackexchange.com/a/273111/120853:
            enlarge left by=0.025\linewidth,
            title=Example\ \thetcbcounter: #2,%
            fonttitle=\sffamily,%
            leftrule=1mm,%
            arc is angular,%
            parbox,% Allows regular paragraph breaks
            breakable,% Breaks across pages
            enhanced,% Hands drawing to tikz
            rightrule=0mm,%
            bottomrule=0mm,%
            % Setting what ends up in 'list of' so that '<Title>' is not shown:
            list text=#2,
            #1,%
            colback=black!05,%
            colframe=black!70,%
            % float,
        }%
    

    이것은 다음과 같습니다.

    이는 명령어 komascript사용 과 통합되어 표준 그림 목록 과 같이 예제 목록list inside=loe 을 가져 와서 인쇄 할 수 있기 때문에 관련이 있습니다 .

    % Declare a new list of contents, with the file suffix in brackets.
    % This will give access to \listof<name>s
    \DeclareNewTOC[%
        type=example,% This also creates types=example+s, that is by appending an s
        % Listname is "List of <Type>s" by default
        % listname={...},
    ]{loe}
    

    마지막 latexmk으로이 새로 생성 된 *.loe파일 에 대해 알려야 합니다. 이는 latexmk컴파일 진행률을 측정하고 완료하기 위해 변경 사항에 대한 보조 파일을 검사하여 작동 하기 때문에 중요 합니다.

  5. 이전 포인트와 비슷한 맥락에서 listings패키지를 사용 하면 생성 된 파일 에서 목록 목록 을 인쇄 할 수 *.lol있습니다. 이전과 마찬가지로 latexmk그것에 대해 알고 싶습니다.

마지막으로 다음 .latexmkrc파일 에서 절정에 이릅니다 .

# Contents of .latexmkrc

# PERL latexmk config file

# PDF-generating modes are:
# 1: pdflatex, as specified by $pdflatex variable (still largely in use)
# 2: postscript conversion, as specified by the $ps2pdf variable (useless) # 3: dvi conversion, as specified by the $dvipdf variable (useless)
# 4: lualatex, as specified by the $lualatex variable (best) # 5: xelatex, as specified by the $xelatex variable (second best)
$pdf_mode = 4; # --shell-escape option (execution of code outside of latex) is required for the #'svg' package. # It converts raw SVG files to the PDF+PDF_TEX combo using InkScape. $lualatex = "lualatex --shell-escape";

# option 2 is same as 1 (run biber when necessary), but also deletes the
# regeneratable bbl-file in a clenaup (`latexmk -c`). Do not use if original
# bib file is not available!
$bibtex_use = 2; # default: 1 # Let latexmk know about generated files, so they can be used to detect if a # rerun is required, or be deleted in a cleanup. # loe: List of Examples (KOMAScript) # lol: List of Listings (listings package) push @generated_exts, 'loe', 'lol'; # Also delete the *.glstex files from package glossaries-extra. Problem is, # that that package generates files of the form "basename-digit.glstex" if # multiple glossaries are present. Latexmk looks for "basename.glstex" and so # does not find those. For that purpose, use wildcard. # Also delete files generated by gnuplot/pgfplots contour plots # (.dat, .script, .table), # and XML file generated by biber runs. $clean_ext = "%R-*.glstex %R_contourtmp*.* %R.run.xml";

# Grabbed from latexmk CTAN distribution:
# Implementing glossary with bib2gls and glossaries-extra, with the
# log file (.glg) analyzed to get dependence on a .bib file.
# !!! ONLY WORKS WITH VERSION 4.54 or higher of latexmk

# Push new file endings into list holding those files
# that are kept and later used again (like idx, bbl, ...):
push @generated_exts, 'glstex', 'glg';

# Add custom dependency.
# latexmk checks whether a file with ending as given in the 2nd
# argument exists ('toextension'). If yes, check if file with
# ending as in first argument ('fromextension') exists. If yes,
# run subroutine as given in fourth argument.
# Third argument is whether file MUST exist. If 0, no action taken.
add_cus_dep('aux', 'glstex', 0, 'run_bib2gls');

# PERL subroutine. $_[0] is the argument (filename in this case). # File from author from here: https://tex.stackexchange.com/a/401979/120853 sub run_bib2gls { if ( $silent ) {
    #    my $ret = system "bib2gls --silent --group '$_[0]'"; # Original version
        my $ret = system "bib2gls --silent --group $_[0]"; # Runs in PowerShell
    } else {
    #    my $ret = system "bib2gls --group '$_[0]'"; # Original version
        my $ret = system "bib2gls --group $_[0]"; # Runs in PowerShell
    };

    my ($base, $path) = fileparse( $_[0] ); if ($path && -e "$base.glstex") { rename "$base.glstex", "$path$base.glstex";
    }

    # Analyze log file.
    local *LOG;
    $LOG = "$_[0].glg";
    if (!$ret && -e $LOG) {
        open LOG, "<$LOG"; while (<LOG>) { if (/^Reading (.*\.bib)\s$/) {
        rdb_ensure_file( $rule, $1 );
        }
    }
    close LOG;
    }
    return $ret;
}

latexmk이 파일을 선택하고 이름이 인 경우 자동으로 구성을 그립니다 .latexmkrc. 따라서 해당 파일의 위치를 ​​지정해야하는 필요성은 pwd.

빌드 환경 (Docker 이미지)

필수 Docker 이미지는 debian기본 이미지와 설치 texlive-full(및 위에서 언급 한 필수 패키지 또는 필요한 모든 것) 를 사용하여 가장 쉽게 얻을 수 있습니다 . 다음과 같이 간단 할 수 있습니다 Dockerfile.

FROM debian:testing

RUN apt-get update --yes \
    && apt-get install --yes --no-install-recommends \
        texlive-full

내 필요에 따라 훨씬 더 복잡한 Dockerfile을 준비 했습니다 (문자 제한으로 인해 주석 제거됨).

ARG BASE_OS
ARG OS_VERSION

FROM ${BASE_OS}:${OS_VERSION} as BASE RUN apt-get update && \ apt-get install --yes --no-install-recommends \ wget \ ca-certificates \ perl FROM BASE as PREPARE ARG TL_VERSION ARG TL_INSTALL_ARCHIVE="install-tl-unx.tar.gz" ARG EISVOGEL_ARCHIVE="Eisvogel.tar.gz" ARG INSTALL_TL_DIR="install-tl" COPY texlive.sh . RUN \ ./texlive.sh get ${TL_VERSION} && \
    wget https://github.com/Wandmalfarbe/pandoc-latex-template/releases/latest/download/${EISVOGEL_ARCHIVE} RUN \ mkdir ${INSTALL_TL_DIR} && \
    tar --extract --file=${TL_INSTALL_ARCHIVE} --directory=${INSTALL_TL_DIR} --strip-components 1 && \
    \
    tar --extract --file=${EISVOGEL_ARCHIVE} FROM BASE as MAIN ARG BUILD_DATE="n/a" ARG VCS_REF="n/a" ARG TL_VERSION ARG TL_PROFILE="texlive.profile" LABEL \ maintainer="Alex Povel <[email protected]>" \ org.label-schema.build-date=${BUILD_DATE} \
    org.label-schema.description="TeXLive with most packages, JavaRE, Inkscape, pandoc and more" \
    org.label-schema.url="https://collaborating.tuhh.de/alex/latex-git-cookbook" \
    org.label-schema.vcs-url="https://github.com/alexpovel/latex-extras-docker" \
    org.label-schema.vcs-ref=${VCS_REF} \ org.label-schema.schema-version="1.0" ARG INSTALL_DIR="/install/" WORKDIR ${INSTALL_DIR}

COPY ${TL_PROFILE} . COPY --from=PREPARE /install-tl/ /texlive.sh ./ COPY --from=PREPARE /eisvogel.tex /usr/share/pandoc/data/templates/eisvogel.latex ARG TEXLIVE_INSTALL_PREFIX="/usr/local/texlive" ARG TEXLIVE_INSTALL_TEXDIR="${TEXLIVE_INSTALL_PREFIX}/${TL_VERSION}" ARG TEXLIVE_INSTALL_TEXMFCONFIG="~/.texlive${TL_VERSION}/texmf-config"
ARG TEXLIVE_INSTALL_TEXMFVAR="~/.texlive${TL_VERSION}/texmf-var" ARG TEXLIVE_INSTALL_TEXMFHOME="~/texmf" ARG TEXLIVE_INSTALL_TEXMFLOCAL="${TEXLIVE_INSTALL_PREFIX}/texmf-local"
ARG TEXLIVE_INSTALL_TEXMFSYSCONFIG="${TEXLIVE_INSTALL_TEXDIR}/texmf-config" ARG TEXLIVE_INSTALL_TEXMFSYSVAR="${TEXLIVE_INSTALL_TEXDIR}/texmf-var"

RUN ./texlive.sh install ${TL_VERSION} RUN luaotfload-tool --update || echo "luaotfload-tool not found, skipping." RUN apt-get update && \ apt-get install --yes --no-install-recommends \ default-jre-headless \ inkscape \ gnuplot-nox \ ghostscript RUN apt-get update && \ apt-get install --yes --no-install-recommends \ librsvg2-bin \ pandoc WORKDIR /tex/ RUN rm --recursive ${INSTALL_DIR}

CMD [ "--lualatex" ]

ENTRYPOINT [ "latexmk" ]

이를 통해 사용자는 빌드 할 TeXLive (아카이브에서 가져옴) 및 Debian 버전을 지정할 수 있습니다. 이를 위해 다음 texlive.sh스크립트 가 필요합니다 . 그것은 사이에 선택합니다 latest(도커) 태그가에서 다운로드하는 경우에 어떤 역사적인 버전 (예를 들어 데비안 9, 2018 TeXLive), TUG 아카이브 :

#!/bin/bash

# Script to fetch `install-tl` script from different sources, depending on argument
# given.

# Error out of any of the variables used here are unbound, e.g. no CLI arg given.
set -u

usage() {
    echo "Usage: $0 get|install latest|version (YYYY)" } if [[ $# != 2 ]]; then
    echoerr "Unsuitable number of arguments given."
    usage
    # From /usr/include/sysexits.h
    exit 64
fi

# From: https://stackoverflow.com/a/2990533/11477374
echoerr() { echo "$@" 1>&2; } # Bind CLI arguments to explicit names: ACTION=${1}
VERSION=${2} # Download the `install-tl` script from the `tlnet-final` subdirectory, NOT # from the parent directory. The latter contains an outdated, non-final `install-tl` # script, causing this exact problem: # https://tug.org/pipermail/tex-live/2017-June/040376.html HISTORIC_URL="ftp://tug.org/historic/systems/texlive/${VERSION}/tlnet-final"
REGULAR_URL="http://mirror.ctan.org/systems/texlive/tlnet"

case ${ACTION} in "get") if [[ ${VERSION} == "latest" ]]
        then
            # Get from default, current repository
            wget ${REGULAR_URL}/${TL_INSTALL_ARCHIVE}
        else
            # Get from historic repository
            wget ${HISTORIC_URL}/${TL_INSTALL_ARCHIVE}
        fi
    ;;
    "install")
        if [[ ${VERSION} == "latest" ]] then # Install using default, current repository perl install-tl \ --profile=${TL_PROFILE}
        else
            # Install using historic repository (`install-tl` script and repository
            # versions need to match)
            perl install-tl \
                --profile=${TL_PROFILE} \ --repository=${HISTORIC_URL}
        fi

        # For `command` usage, see:
        # https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#Bash-Builtins.
        # The following test assumes the most basic program, `tex`, is present.
        if command -v tex &> /dev/null
        then
            # If automatic `install-tl` process has already adjusted PATH, we are happy.
            echo "PATH and installation seem OK."
        else
            # Try and make installation available on path manually.
            #
            # The first wildcard expands to the architecture (should be 'x86_64-linux',
            # which might change in TeXLive upstream, so do not hardcode here),
            # the second one expands to all binaries found in that directory.
            # Only link if directory exists, else we end up with a junk symlink.
            EXPECTED_INSTALL_TEXDIR=${TEXLIVE_INSTALL_TEXDIR}/bin/* # `ls` found to be more robust than `[ -d ... ]`. if ls ${EXPECTED_INSTALL_TEXDIR} 1>/dev/null 2>&1
            then
                SYMLINK_DESTINATION="/usr/local/bin"

                # "String contains", see: https://stackoverflow.com/a/229606/11477374
                if [[ ! ${PATH} == *${SYMLINK_DESTINATION}* ]]
                then
                    # Should never get here, but make sure.
                    echoerr "Symlink destination ${SYMLINK_DESTINATION} not in PATH (${PATH}), exiting."
                    exit 1
                fi

                echo "Symlinking TeXLive binaries in ${EXPECTED_INSTALL_TEXDIR}" echo "to a directory (${SYMLINK_DESTINATION}) found on PATH (${PATH})" # Notice the wildcard: ln --symbolic --verbose ${EXPECTED_INSTALL_TEXDIR}/* ${SYMLINK_DESTINATION}

                if command -v tex &> /dev/null
                then
                    echo "PATH and installation seem OK."
                else
                    echoerr "Manual symlinking failed and TeXLive did not modify PATH automatically."
                    echoerr "Exiting."
                    exit 1
                fi
            else
                echoerr "Expected TeXLive installation dir not found and TeXLive installation did not modify PATH automatically."
                echoerr "Exiting."
                exit 1
            fi
        fi
    ;;
    *)
        echoerr "Input not understood."
        usage
        # From /usr/include/sysexits.h
        exit 64
esac

또한 TeXLive 설치는 install-tl스크립트를 사용하여 수동으로 수행 됩니다. 무인 설치의 경우 다음 과 같은 프로필 파일 이 필요합니다 texlive.profile(문자 제한으로 인해 주석이 제거됨).

selected_scheme scheme-custom

collection-basic 1
collection-bibtexextra 1
collection-binextra 1
collection-fontsextra 1
collection-fontsrecommended 1
collection-fontutils 1
collection-formatsextra 1
collection-langenglish 1
collection-langeuropean 1
collection-langgerman 1
collection-latex 1
collection-latexextra 1
collection-latexrecommended 1
collection-luatex 1
collection-mathscience 1
collection-pictures 1
collection-plaingeneric 1
collection-publishers 1
collection-xetex 1

collection-context 0
collection-games 0
collection-humanities 0
collection-langarabic 0
collection-langchinese 0
collection-langcjk 0
collection-langcyrillic 0
collection-langczechslovak 0
collection-langfrench 0
collection-langgreek 0
collection-langitalian 0
collection-langjapanese 0
collection-langkorean 0
collection-langother 0
collection-langpolish 0
collection-langportuguese 0
collection-langspanish 0
collection-metapost 0
collection-music 0
collection-pstricks 0
collection-texworks 0
collection-wintools 0

instopt_adjustpath 1
instopt_adjustrepo 0
instopt_letter 0
instopt_portable 0
instopt_write18_restricted 1
tlpdbopt_autobackup 0
tlpdbopt_backupdir tlpkg/backups
tlpdbopt_create_formats 1
tlpdbopt_desktop_integration 0
tlpdbopt_file_assocs 0
tlpdbopt_generate_updmap 0
tlpdbopt_install_docfiles 0
tlpdbopt_install_srcfiles 0
tlpdbopt_post_code 1

원한다면이 파일이 이미지 빌드 프로세스의 핵심입니다. 다운로드 및 설치할 LaTeX 패키지를 지정합니다. 여기에서 빌드를 수정할 수 있으며 가장 중요한 것은 슬림화 할 수 있습니다. 예를 들어, 문서 파일의 설치 / 다운로드는 여기에서 명시 적으로 생략됩니다. 단순히를 실행할 때는 불가능한 일 apt-get install texlive-full이며 여러 GB의 공간을 절약합니다.

이러한 이미지는 DockerHub 에서 이미 빌드되고 사용 가능합니다 (지속적으로 통합 된 방식 : git push소스 저장소의 모든 항목 이 빌드를 트리거 함) . 이를 사용 하면 TUG 아카이브 서버에 부담을주지 않고 직접 빌드하는 것과 동일한 이미지를 얻을 수 있습니다 . 이러한 이미지는 DockerHub의 빌드 후크를 사용하여 자동으로 빌드 되며 설정 페이지는 다음과 같습니다 ( 여기 참조 ).

CI 구성

이것은 GitLab에만 해당됩니다. 아직 GitHub / Travis에 대해 구현하지 않았습니다.

*.tex루트 및에서 하나 이상의 파일 이있는 지정된 저장소 README.md에서 아래 CI YAML 구성 (문자 제한으로 인한 주석 없음)은 다음을 수행합니다.

  1. 위의 DockerHub 리포지토리에서 이미지를 가져 와서 ENTRYPOINT명령을 아무것도없는 것으로 바꾸십시오 (일반 셸이라고도 함). 이는 script부품이 작동 하는 데 중요 하지만은 ENTRYPOINT데스크탑에서 컨테이너를 실행하는 데 편리합니다.
  2. 프로젝트 루트에 있는 LaTeX 클래스 파일 의 n.a.in \newcommand*{\GitVersion}{n.a.}\newcommand*{\GitShortHash}{n.a.}from *.cls을 해당 빌드의 실제 현재 값으로 바꿉니다 . 이를 통해 VCS 메타 데이터를 PDF로 인쇄 할 수 있습니다.
  3. 단순히 .NET을 발행하여 LaTeX를 PDF로 빌드하십시오 latexmk. 에서 지침을 가져옵니다 .latexmkrc. 위를 참조하십시오.
  4. 다시 변환에 사용하는을 사용 README.md하여 에서 PDF를 컴파일합니다 . 이것은 더 예쁜 출력을위한 템플릿을 사용하고 있습니다. 이 단계는에 대한 속임수 / 쇼케이스에 가깝습니다 .pandoclualatexpandoc

결과 PDF는 CI 파이프 라인의 아티팩트 이며 성공적인 실행 후 다운로드 할 수 있습니다.

default:
    image:
        name: alexpovel/latex
        entrypoint: [ "" ]
    retry:
        max: 1
        when: runner_system_failure
    artifacts:
        name: "$CI_COMMIT_REF_NAME"
        paths:
            - "*.pdf"
stages:
    - prepare
    - build

insert_git_metadata:
    stage: prepare
    script:
        - |
            declare -A GITINFO=(
                [GitVersion]=$CI_COMMIT_REF_NAME [GitShortHash]=$CI_COMMIT_SHORT_SHA
            )
        - |
            for k in "${!GITINFO[@]}" do sed -i "s~\(newcommand\*{\\\\$k}\){.*}~\1{${GITINFO[$k]}}~" *.cls
                done
    artifacts:
        paths:
            - "*.cls"
    needs: []

build_latex:
    stage: build
    script:
        - latexmk
    dependencies:
        - insert_git_metadata

build_pandoc:
    stage: build
    script:
        - 'sed -i "s~\(^date: \)\".*\"~\1\"$(date +"%B %-d, %Y")\"~" README.md'
        - |
            pandoc README.md \
            --template eisvogel --pdf-engine=lualatex --number-sections \
            -o README.pdf
    needs: []
tfran Aug 18 2020 at 01:38

죄송합니다. CI가 무엇을 의미하는지 모르겠습니다. 컴퓨터에 GNU make가있는 경우 다음과 같이 작은 makefile을 작성할 수 있습니다.

FILE=yourfilename


.PHONY: clean cleanall

all:$(FILE).pdf clean: -rm *.aux *.blg *.out *.bbl *.lot *.lof *.glo *.ist *.acn *.acr *.alg *.glg *.gls *.toc *.bcf *.run.xml cleanall: -rm *.aux *.blg *.out *.bbl *.log *.lot *.lof *.glo *.ist *.acn *.acr *.alg *.glg *.gls *.toc *.bcf *.run.xml #report#.pdf $(FILE).pdf: *.tex
    E:\miktex-portable\texmfs\install\miktex\bin\x64\lualatex.exe $(FILE) E:\miktex-portable\texmfs\install\miktex\bin\x64\biber.exe $(FILE)
    E:\miktex-portable\texmfs\install\miktex\bin\x64\makeglossaries.exe $(FILE) E:\miktex-portable\texmfs\install\miktex\bin\x64\lualatex.exe $(FILE)
    E:\miktex-portable\texmfs\install\miktex\bin\x64\lualatex.exe $(FILE)

이 예제는 Windows 용 OS입니다. E : \ miktex-portable ... \ 대신 설치에 맞는 경로를 조정하십시오. GNU / Linux가 있다면 실행 파일의 전체 경로를 지정할 필요가 없도록 $ PATH를 설정할 수 있습니다 (예 : 'lualatex $ (FILE)'등). 참고 목록은 biber 및 biblatex를 사용하여 생성되고 있음을 이해합니다. makefile (동일한 파일 이름)은 * .tex 파일이있는 동일한 디렉토리에 있어야합니다. 그런 다음 명령 줄 터미널에 'make'를 입력하기 만하면됩니다. 마찬가지로 'make clean'및 'make cleanall'은 디렉토리를 정리하는 데 도움이 될 수 있습니다.

ymindstorm Aug 26 2020 at 18:55

결국 내가 한 일은 latexmkCI에 적용 latexmk하고 glossaries패키지 를 돕기 위해 추가 규칙을 적용하는 것 입니다.

자동화 된 빌드는 빌드 환경과 miktex 도커 이미지를 설정 한 후 다음을 수행합니다.

mpm --install=latexmk

문서를 작성할 때 다음 명령이 사용됩니다.

latexmk -r "<path-to-rc-file>/.latexmkrc" -lualatex -latexoption="-interaction=nonstopmode"

.latexmkrc우리는 또한 등 우리의 공유 문서 수업을 어디에 파일은 우리의 문서 저장소의 모든 공유 힘내 서브 모듈에

내용은 다음과 같습니다. .latexmkrc

# This shows how to use lualatex (http://en.wikipedia.org/wiki/LuaTeX)
# with latexmk.  
#
#   WARNING: The method shown here is suitable only for ver. 4.51 and
#            later of latexmk, not for earlier versions.
#

$pdf_mode = 4; $postscript_mode = $dvi_mode = 0; # This shows how to use the glossaries package # (http://www.ctan.org/pkg/glossaries) and the glossaries-extra package # (http://www.ctan.org/pkg/glossaries-extra) with latexmk. add_cus_dep( 'acn', 'acr', 0, 'makeglossaries' ); add_cus_dep( 'glo', 'gls', 0, 'makeglossaries' ); $clean_ext .= " acr acn alg glo gls glg";
sub makeglossaries {
   my ($base_name, $path) = fileparse( $_[0] ); pushd $path;
   my $return = system "makeglossaries", $base_name;
   popd;
   return $return;
}

여기 에서 가져 왔습니다 .

최종 결과는 문서와 그 내용에 관계없이 일관된 빌드 경험을 보장합니다. 이 접근 방식은 유연하고 확장 가능하므로 작성할 때 로컬 도커 컨테이너에서 정확히 동일한 도구 체인을 사용할 수 있습니다.