LuaLaTeX: ทำการคอมไพล์หลายรายการโดยอัตโนมัติด้วย ToC, Index, Bibliography, Glossary และอื่น ๆ บน CI

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ดูเหมือนว่าเครื่องมือที่ถูกต้องสำหรับงานนี้ หากต้องการดูว่าสามารถนำไปใช้งานได้อย่างไรให้ฉันเน้นบิตที่เกี่ยวข้องจากไปป์ไลน์ CI ของเอกสาร / เทมเพลต LaTeX ของฉันเอง (บน GitLab) นี่ควรเป็นตัวอย่างที่ใช้งานได้สำหรับ "การคอมไพล์ที่ซับซ้อนสำหรับแพ็กเกจต่างๆ" ฉันจะเข้าสู่การกำหนดค่าประกอบDockerfileและGitLab CIด้วยนอกเหนือจาก LaTeX-specific / latexmkpart เนื่องจากทุกส่วนเชื่อมต่อกันอย่างแน่นหนา

ทุกอย่างที่มีรายละเอียดด้านล่างสามารถนำไปใช้และ (หวังว่า ... ) จะทำงานในโครงการนี้ ฉันพยายามรักษาคำตอบนี้ให้เป็นตัวของตัวเองมากที่สุด ลิงก์ไปยังโครงการจะมีสถานะล่าสุดซึ่งจะแทนที่คำตอบนี้ในที่สุด


แพ็คเกจ LaTeX และการกระจาย (Debian)

ในท่อที่เชื่อมโยงมีแพ็คเกจสองสามชุดที่ต้องให้ความสนใจเป็นพิเศษในการตั้งค่า ไม่น่าเป็นไปได้ที่คุณจะมีข้อกำหนดเหมือนกันทุกประการ แต่ฉันระบุไว้ที่นี่เพื่อความครบถ้วนสมบูรณ์

  1. glossaries-extraซึ่งสร้างขึ้นด้านบนglossariesต้องbib2glsแปลงและประมวลผล*.bibไฟล์lualatexเพื่อใช้งานได้

    สิ่งนี้สะท้อนให้เห็นในการตั้งค่าสองเท่า:

    1. ภาพเทียบท่าต้องการ Java Runtime Environment สำหรับbib2gls,
    2. latexmkจะต้องแจ้งให้ทราบเกี่ยวกับการมีอยู่ของbib2glsไฟล์
  2. pgfplotsด้วยcontourตัวเลือก\addplot3( ตัวอย่าง ) ต้องใช้gnuplotโปรแกรมภายนอก อีกครั้งสิ่งนี้สะท้อนให้เห็นถึงสองเท่า:

    1. lualatex(หรือเครื่องมือที่คุณเลือก) ต้องการการเข้าถึงการเขียนภายนอกgnuplotเพื่อเขียนผลการคำนวณไปยังไฟล์pgfplotsเพื่ออ่าน: --shell-escapeจำเป็นซึ่งlatexmkจะต้องมีการแจ้ง
    2. gnuplotเนื่องจากแพคเกจการแจกจ่าย (ซึ่งต่างจากแพ็คเกจ LaTeX) จะต้องมีอยู่เช่นapt-get install gnuplotบนโฮสต์ Debian
  3. LaTeX ไม่สามารถฝัง*.svgไฟล์ได้ การฝังไฟล์ดังกล่าวจำเป็นต้องแปลงเป็น PDF (หรือรูปแบบที่ฝังได้อื่น ๆ ) ก่อน นี้สามารถทำได้โดยใช้Inkscapeและกิจวัตรประจำวัน*.pdf_tex อย่างไรก็ตามสิ่งนี้ทำให้เรามีไฟล์พิเศษสองไฟล์ต่อไฟล์ SVG: *.pdfและ*.pdf_tex. ทุกครั้งที่มีการเปลี่ยนแปลงในไฟล์ SVG ไฟล์ที่ได้รับจะต้องได้รับการอัปเดต สิ่งนี้นำไปสู่ความขัดแย้งที่อาจเกิดขึ้นรวมถึงในบริบทของการควบคุมเวอร์ชัน ( gitฯลฯ ): เวอร์ชันใดที่ต้องเก็บไว้

    svgแพคเกจน้ำยางแก้ปัญหาเหล่านี้โดยอัตโนมัติกระบวนการแปลง ไฟล์ที่สร้างขึ้น*.pdfและ*.pdf_texไฟล์สามารถถือเป็นไฟล์ชั่วคราว / ที่ได้รับและทิ้งได้อย่างอิสระ เพียง SVGs ยังคงเป็นแหล่งเดียวของความจริง ในฐานะที่เป็นโบนัสเป็นแบบข้อความ (XML)พวกเขายังเหมาะสำหรับ VCS เช่นgit(ซึ่ง PDF ไบนารีไม่ได้เป็นจริง)

    ก่อนหน้านี้จะแสดงให้เห็นในการตั้งค่าด้านล่างในสองที่:

    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แท็ก (Docker) และเวอร์ชันเก่า (เช่น Debian 9, TeXLive 2018) ซึ่งในกรณีนี้จะดาวน์โหลดจากไฟล์เก็บถาวร 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

โปรดทราบว่าภาพเหล่านี้ถูกสร้างขึ้นแล้วและพร้อม (ในทางที่บูรณาการอย่างต่อเนื่องทุกgit pushใน repo แหล่งที่จะทำให้การสร้าง) บนDockerHub ใช้เหล่านั้นจะสุทธิภาพเดียวกันกับการสร้างมันด้วยตัวเองโดยไม่ต้องรัดเซิร์ฟเวอร์ลากจูงที่เก็บ อิมเมจเหล่านี้สร้างขึ้นโดยอัตโนมัติโดยใช้build hookของ DockerHub ซึ่งหน้าการตั้งค่าจะดูเหมือน (ดูเพิ่มเติมที่นี่ ):

การกำหนดค่า CI

สิ่งนี้เฉพาะสำหรับ GitLab ฉันยังไม่ได้ติดตั้งสิ่งนี้กับ GitHub / Travis เลย

ในที่เก็บที่กำหนดซึ่งมี*.texไฟล์ตั้งแต่หนึ่งไฟล์ขึ้นไปที่รูทเช่นเดียวกับ a README.mdการกำหนดค่า CI YAML ด้านล่าง (โดยไม่มีความคิดเห็นเนื่องจากจำนวนอักขระสูงสุด) จะ:

  1. ดึงภาพจากที่เก็บ DockerHub ด้านบนโดยแทนที่ENTRYPOINTคำสั่งใด ๆโดยไม่มีอะไรเลย (aka เปลือกธรรมดา) นี่เป็นสิ่งสำคัญสำหรับชิ้นscriptส่วนในการทำงานในขณะที่ENTRYPOINTสะดวกสำหรับการเรียกใช้คอนเทนเนอร์บนเดสก์ท็อปของคุณ
  2. แทนที่n.a.ใน\newcommand*{\GitVersion}{n.a.}และ\newcommand*{\GitShortHash}{n.a.}จาก*.clsไฟล์คลาส LaTeX (ในรูทโปรเจ็กต์) ด้วยค่าจริงปัจจุบันของบิลด์นั้น สิ่งนี้ช่วยให้สามารถพิมพ์ข้อมูลเมตา VCS ใน PDF ได้
  3. สร้างน้ำยางเป็น PDF latexmkโดยเพียงแค่การออก มันจะวาดคำแนะนำจาก.latexmkrcดูด้านบน
  4. รวบรวม PDF จากการREADME.mdใช้pandocซึ่งใช้lualatexสำหรับการแปลงอีกครั้ง นี่คือการใช้เทมเพลตสำหรับผลลัพธ์ที่สวยกว่า ขั้นตอนนี้จะมีมากขึ้นของกลไก / pandocตู้โชว์

ไฟล์ 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 ในเครื่องคุณสามารถเขียน 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ไฟล์ใน submodule Git ที่ใช้ร่วมกันระหว่างทั้งของที่เก็บเอกสารของเราที่เรายังมีชั้นเรียนเอกสารร่วมกันของเรา ฯลฯ

นี่คือเนื้อหาของ .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;
}

นำมาจากที่นี่

ผลลัพธ์สุดท้ายช่วยให้มั่นใจได้ถึงประสบการณ์การสร้างที่สอดคล้องกันโดยไม่คำนึงถึงเอกสารและเนื้อหา วิธีนี้ยังมีความยืดหยุ่นและขยายได้ซึ่งอาจอนุญาตให้ใช้ห่วงโซ่เครื่องมือเดียวกันจากคอนเทนเนอร์นักเทียบท่าในเครื่องเมื่อเขียน