LuaLaTeX: ทำการคอมไพล์หลายรายการโดยอัตโนมัติด้วย ToC, Index, Bibliography, Glossary และอื่น ๆ บน CI
หากต้องการสร้างเอกสารที่ทำซ้ำได้และเชื่อถือได้บนระบบ 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 โดยทั่วไป แต่ไม่พบสิ่งที่ใช้งานได้ ความช่วยเหลือของคุณเป็นที่ชื่นชมมาก
คำตอบ
ตามที่คนอื่น ๆ และตัวคุณเองได้กล่าวไว้latexmkดูเหมือนว่าเครื่องมือที่ถูกต้องสำหรับงานนี้ หากต้องการดูว่าสามารถนำไปใช้งานได้อย่างไรให้ฉันเน้นบิตที่เกี่ยวข้องจากไปป์ไลน์ CI ของเอกสาร / เทมเพลต LaTeX ของฉันเอง (บน GitLab) นี่ควรเป็นตัวอย่างที่ใช้งานได้สำหรับ "การคอมไพล์ที่ซับซ้อนสำหรับแพ็กเกจต่างๆ" ฉันจะเข้าสู่การกำหนดค่าประกอบDockerfileและGitLab CIด้วยนอกเหนือจาก LaTeX-specific / latexmk
part เนื่องจากทุกส่วนเชื่อมต่อกันอย่างแน่นหนา
ทุกอย่างที่มีรายละเอียดด้านล่างสามารถนำไปใช้และ (หวังว่า ... ) จะทำงานในโครงการนี้ ฉันพยายามรักษาคำตอบนี้ให้เป็นตัวของตัวเองมากที่สุด ลิงก์ไปยังโครงการจะมีสถานะล่าสุดซึ่งจะแทนที่คำตอบนี้ในที่สุด
แพ็คเกจ LaTeX และการกระจาย (Debian)
ในท่อที่เชื่อมโยงมีแพ็คเกจสองสามชุดที่ต้องให้ความสนใจเป็นพิเศษในการตั้งค่า ไม่น่าเป็นไปได้ที่คุณจะมีข้อกำหนดเหมือนกันทุกประการ แต่ฉันระบุไว้ที่นี่เพื่อความครบถ้วนสมบูรณ์
glossaries-extraซึ่งสร้างขึ้นด้านบน
glossaries
ต้องbib2glsแปลงและประมวลผล*.bib
ไฟล์lualatex
เพื่อใช้งานได้สิ่งนี้สะท้อนให้เห็นในการตั้งค่าสองเท่า:
- ภาพเทียบท่าต้องการ Java Runtime Environment สำหรับ
bib2gls
, latexmk
จะต้องแจ้งให้ทราบเกี่ยวกับการมีอยู่ของbib2gls
ไฟล์
- ภาพเทียบท่าต้องการ Java Runtime Environment สำหรับ
pgfplotsด้วย
contour
ตัวเลือก\addplot3
( ตัวอย่าง ) ต้องใช้gnuplotโปรแกรมภายนอก อีกครั้งสิ่งนี้สะท้อนให้เห็นถึงสองเท่า:lualatex
(หรือเครื่องมือที่คุณเลือก) ต้องการการเข้าถึงการเขียนภายนอกgnuplot
เพื่อเขียนผลการคำนวณไปยังไฟล์pgfplots
เพื่ออ่าน:--shell-escape
จำเป็นซึ่งlatexmk
จะต้องมีการแจ้งgnuplot
เนื่องจากแพคเกจการแจกจ่าย (ซึ่งต่างจากแพ็คเกจ LaTeX) จะต้องมีอยู่เช่นapt-get install gnuplot
บนโฮสต์ Debian
LaTeX ไม่สามารถฝัง
*.svg
ไฟล์ได้ การฝังไฟล์ดังกล่าวจำเป็นต้องแปลงเป็น PDF (หรือรูปแบบที่ฝังได้อื่น ๆ ) ก่อน นี้สามารถทำได้โดยใช้Inkscapeและกิจวัตรประจำวัน*.pdf_tex อย่างไรก็ตามสิ่งนี้ทำให้เรามีไฟล์พิเศษสองไฟล์ต่อไฟล์ SVG:*.pdf
และ*.pdf_tex
. ทุกครั้งที่มีการเปลี่ยนแปลงในไฟล์ SVG ไฟล์ที่ได้รับจะต้องได้รับการอัปเดต สิ่งนี้นำไปสู่ความขัดแย้งที่อาจเกิดขึ้นรวมถึงในบริบทของการควบคุมเวอร์ชัน (git
ฯลฯ ): เวอร์ชันใดที่ต้องเก็บไว้svgแพคเกจน้ำยางแก้ปัญหาเหล่านี้โดยอัตโนมัติกระบวนการแปลง ไฟล์ที่สร้างขึ้น
*.pdf
และ*.pdf_tex
ไฟล์สามารถถือเป็นไฟล์ชั่วคราว / ที่ได้รับและทิ้งได้อย่างอิสระ เพียง SVGs ยังคงเป็นแหล่งเดียวของความจริง ในฐานะที่เป็นโบนัสเป็นแบบข้อความ (XML)พวกเขายังเหมาะสำหรับ VCS เช่นgit
(ซึ่ง PDF ไบนารีไม่ได้เป็นจริง)ก่อนหน้านี้จะแสดงให้เห็นในการตั้งค่าด้านล่างในสองที่:
- สำหรับการโทร CLI
inkscape
(เมื่อเทียบกับ GUI นั้นสำหรับการทำงานinkscape
จะต้องมีในของคุณ$PATH
)--shell-escape
สำหรับการอ่านและการเขียนเครื่องยนต์น้ำยางต้อง inkscape
จำเป็นต้องพร้อมใช้งานในสภาพแวดล้อมการสร้าง (อิมเมจ Docker)
- สำหรับการโทร CLI
การใช้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
ทำงานโดยการตรวจสอบไฟล์เสริมสำหรับการเปลี่ยนแปลงเพื่อวัดความคืบหน้าการคอมไพล์และการเสร็จสิ้นในหลอดเลือดดำที่คล้ายกันกับจุดก่อนหน้าการใช้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 ด้านล่าง (โดยไม่มีความคิดเห็นเนื่องจากจำนวนอักขระสูงสุด) จะ:
- ดึงภาพจากที่เก็บ DockerHub ด้านบนโดยแทนที่
ENTRYPOINT
คำสั่งใด ๆโดยไม่มีอะไรเลย (aka เปลือกธรรมดา) นี่เป็นสิ่งสำคัญสำหรับชิ้นscript
ส่วนในการทำงานในขณะที่ENTRYPOINT
สะดวกสำหรับการเรียกใช้คอนเทนเนอร์บนเดสก์ท็อปของคุณ - แทนที่
n.a.
ใน\newcommand*{\GitVersion}{n.a.}
และ\newcommand*{\GitShortHash}{n.a.}
จาก*.cls
ไฟล์คลาส LaTeX (ในรูทโปรเจ็กต์) ด้วยค่าจริงปัจจุบันของบิลด์นั้น สิ่งนี้ช่วยให้สามารถพิมพ์ข้อมูลเมตา VCS ใน PDF ได้ - สร้างน้ำยางเป็น PDF
latexmk
โดยเพียงแค่การออก มันจะวาดคำแนะนำจาก.latexmkrc
ดูด้านบน - รวบรวม 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: []
ขออภัยฉันไม่ทราบว่า 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' สามารถช่วยคุณจัดระเบียบไดเรกทอรีของคุณได้
สิ่งที่ฉันทำคือสมัครlatexmk
CI และใช้กฎเพิ่มเติม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;
}
นำมาจากที่นี่
ผลลัพธ์สุดท้ายช่วยให้มั่นใจได้ถึงประสบการณ์การสร้างที่สอดคล้องกันโดยไม่คำนึงถึงเอกสารและเนื้อหา วิธีนี้ยังมีความยืดหยุ่นและขยายได้ซึ่งอาจอนุญาตให้ใช้ห่วงโซ่เครื่องมือเดียวกันจากคอนเทนเนอร์นักเทียบท่าในเครื่องเมื่อเขียน