LuaLaTeX: Mengotomatiskan banyak kompilasi dengan ToC, Indeks, Bibliografi, Glosarium, dan lainnya di CI
Untuk memiliki kumpulan dokumen yang dapat direproduksi dan andal pada sistem CI jarak jauh, saya ingin mengotomatiskan semua alat baris perintah dan beberapa kompilasi yang diperlukan untuk menghasilkan dokumen yang lengkap. Pipeline ini harus mengerjakan dokumen apa pun di luar kotak terlepas dari plugin mana yang sebenarnya digunakan dalam dokumen tersebut.
Menurut pemahaman saya, ada cara agar LaTeX membangun secara otomatis melakukan semua langkah yang diperlukan, tetapi sejauh ini saya tidak berhasil dengan pendekatan apa pun.
Detail
Pengaturan saya saat ini adalah ini:
- Dokumen ditulis dan dikompilasi di mesin saya menggunakan LuaLaTeX dan MiKTeX
- CI terdiri dari gambar MiKTeX Docker ( lihat di sini ) dengan semua font khusus dan sumber daya terpasang
Secara lokal saya harus melakukan berbagai tindakan secara berurutan untuk menyusun dokumen yang harus saya ketahui sebagai penulis dokumen. Tetapi CI harus dapat membangun dokumen apa pun tanpa menerapkan pengaturan khusus per dokumen dan menghasilkan kesalahan ketika dokumen tidak dapat dikompilasi dengan benar atau ada sesuatu yang hilang.
Contoh: Glosarium
Ketika saya perlu membuat dokumen tempat saya menggunakan glossaries
paket, build lokal akan terlihat seperti ini
lualatex doc.tex
makeglossaries doc
lualatex doc.tex
Sekarang CI tidak tahu apakah dokumen tersebut memerlukan langkah ini atau tidak, tetapi masih dapat membangun dokumen tersebut. Dalam dokumentasi glosarium ada penyebutan automake
param dan --shell-escape
opsi untuk menyusun dokumen yang saya asumsikan akan memungkinkan saya untuk mengkompilasi semuanya sekaligus tetapi ini tidak berfungsi pada CI. Demikian pula saya memiliki masalah yang sama dengan ToC, indeks, bibliografi, dll.
Ringkasan
Apakah ada cara umum untuk mengotomatiskan kompilasi kompleks untuk paket yang berbeda? (Entah dibangun di LuaLaTeX atau beberapa skrip tujuan umum kustom)
Apakah ada masalah dengan penyiapan saya yang dapat mencegah semua langkah terjadi secara otomatis?
Saya telah menjelajahi banyak sumber daya untuk paket tertentu atau LaTeX secara umum tetapi tidak dapat menemukan sesuatu yang berfungsi. Bantuan Anda sangat kami hargai.
Jawaban
Seperti orang lain dan Anda sendiri telah menyebutkan, latexmktampaknya alat yang tepat untuk pekerjaan ini. Untuk melihat bagaimana hal itu dapat diimplementasikan, izinkan saya menyorot bit yang relevan dari pipeline CI dokumen / template LaTeX saya sendiri (di GitLab). Ini harus menjadi contoh yang dapat digunakan untuk "kompilasi kompleks untuk paket yang berbeda". Saya akan masuk ke konfigurasi CI yang menyertai Dockerfiledan GitLab CI juga, selain LaTeX-spesifik / latexmk
bagian, karena semua bagian digabungkan dengan erat.
Semua detail di bawah ini dapat dilihat diimplementasikan dan (semoga ...) bekerja di proyek ini . Saya mencoba untuk menjaga jawaban ini serba lengkap mungkin. Tautan ke proyek akan berisi status terbaru, yang pada akhirnya akan menggantikan jawaban ini.
Paket LaTeX dan Distribusi (Debian)
Di pipeline tertaut, ada beberapa paket yang memerlukan perhatian khusus dalam penyiapan. Kemungkinan Anda tidak akan memiliki persyaratan yang persis sama, tetapi saya mencantumkannya di sini untuk kelengkapan.
glossaries-extra, membangun di atas
glossaries
, perlu bib2glsmengonversi dan memproses*.bib
file untuklualatex
digunakan.Ini tercermin dalam pengaturan dua kali lipat:
- Image Docker membutuhkan Java Runtime Environment untuk
bib2gls
, latexmk
perlu diberi tahu tentang keberadaanbib2gls
file.
- Image Docker membutuhkan Java Runtime Environment untuk
pgfplotsdengan
contour
pilihannya\addplot3
( contoh ) membutuhkan gnuplotprogram eksternal . Sekali lagi, ini tercermin dua kali lipat:lualatex
(atau mesin pilihan Anda) memerlukan akses tulis dari luar untukgnuplot
menulis hasil perhitungannya ke file untukpgfplots
dibaca:--shell-escape
diperlukan, yang manalatexmk
harus diberi tahu.gnuplot
, karena paket distribusi (sebagai lawan dari paket LaTeX) harus ada, misalnyaapt-get install gnuplot
pada host Debian.
LaTeX tidak dapat menyematkan
*.svg
file secara asli. Menyematkan file semacam itu memerlukan konversi ke PDF (atau beberapa format lain yang dapat disematkan) terlebih dahulu. Ini dapat dicapai dengan menggunakan Inkscape dan *.pdf_texrutinitasnya . Namun, ini menyisakan dua file tambahan untuk setiap file SVG:*.pdf
dan*.pdf_tex
. Pada setiap perubahan dalam file SVG, file turunan harus diperbarui. Hal ini menyebabkan potensi konflik, juga dalam konteks kontrol versi (git
dll.): Versi mana yang akan disimpan?The svgpaket LaTeX memecahkan masalah ini dengan mengotomatisasi proses konversi. File
*.pdf
dan*.pdf_tex
file yang dihasilkan dapat diperlakukan sebagai file sementara / turunan dan dibuang secara bebas. Hanya SVG yang tersisa, sebagai satu sumber kebenaran . Sebagai bonus, karena berbasis teks (XML) , mereka juga cocok untuk VCSgit
(yang sebenarnya bukan PDF biner).Seperti sebelumnya, ini tercermin dalam penyiapan di bawah ini di dua tempat:
- Untuk memanggil CLI
inkscape
(sebagai lawan GUI; agar ini berfungsi,inkscape
harus ada di Anda$PATH
) untuk membaca dan menulis, mesin LaTeX membutuhkan--shell-escape
. inkscape
harus tersedia di lingkungan build (image Docker).
- Untuk memanggil CLI
Menggunakan tcolorboxdan
\newtcolorbox
perintahnya, saya membuat lingkungan baru untuk Contoh :\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, }%
Ini terlihat seperti:
Ini relevan karena terintegrasi dengan komascriptmenggunakan
list inside=loe
instruksi, memungkinkan kita untuk mengambil dan mencetak Daftar Contoh , seperti Daftar Gambar standar :% 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}
Terakhir,
latexmk
perlu diberi tahu tentang*.loe
file yang baru dibuat ini . Ini penting karenalatexmk
bekerja dengan memeriksa file tambahan untuk perubahan guna mengukur kemajuan dan penyelesaian kompilasi.Dengan nada yang sama seperti poin sebelumnya, menggunakan listingspaket akan memungkinkan kita untuk mencetak Daftar listing dari
*.lol
file yang dihasilkan . Seperti sebelumnya,latexmk
pasti ingin tahu tentang itu.
Akhirnya, ini berujung pada .latexmkrc
file berikut :
# 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
akan mengambil file ini dan menarik konfigurasi darinya secara otomatis, jika dinamai .latexmkrc
. Jadi kebutuhan untuk menentukan lokasi file itu secara eksplisit menghilang jika ada di pwd
.
Lingkungan Bangun (gambar Docker)
Gambar Docker yang diperlukan paling mudah diperoleh menggunakan debian
gambar dasar dan menginstal texlive-full
(dan paket apa pun yang diperlukan yang disebutkan di atas, atau apa pun yang Anda butuhkan). Ini bisa sesederhana berikut ini Dockerfile
:
FROM debian:testing
RUN apt-get update --yes \
&& apt-get install --yes --no-install-recommends \
texlive-full
Untuk kebutuhan saya sendiri, saya menyiapkan Dockerfile yang jauh lebih terlibat (komentar dihapus karena batas karakter):
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" ]
Ini memungkinkan pengguna untuk menentukan TeXLive (menggambar dari arsip mereka) dan versi Debian mana yang akan dibuat. Untuk ini, diperlukan texlive.sh
skrip berikut . Itu memilih antara latest
tag (Docker) dan beberapa versi historis (misalnya Debian 9, TeXLive 2018), dalam hal ini diunduh dari arsip 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
Selanjutnya, penginstalan TeXLive dilakukan secara manual menggunakan install-tlskrip mereka . Untuk penginstalan tanpa pengawasan, diperlukan file profil , seperti ini texlive.profile
(komentar dihapus karena batas karakter):
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
Jika Anda mau, file ini adalah inti dari proses pembuatan gambar. Ini menentukan paket LaTeX mana yang akan diunduh dan diinstal. Anda dapat memodifikasi, dan mungkin yang terpenting, menurunkan berat badan, bangunan Anda di sini. Misalnya, menginstal / mengunduh file dokumentasi secara eksplisit dihilangkan di sini, sesuatu yang tidak mungkin dilakukan saat dijalankan apt-get install texlive-full
, menghemat banyak GB ruang.
Perhatikan bahwa image ini sudah dibuat dan tersedia (dengan cara yang terus terintegrasi: setiap git push
di repo sumber akan memicu build) di DockerHub . Menggunakan itu akan menjaring gambar yang sama seperti membangunnya sendiri, tanpa membebani server arsip TUG . Gambar-gambar ini dibuat secara otomatis menggunakan pengait build DockerHub , di mana halaman pengaturan terlihat seperti (lihat juga di sini ):

Konfigurasi CI
Ini khusus untuk GitLab. Saya belum menerapkan ini untuk GitHub / Travis.
Dalam repositori tertentu dengan satu atau beberapa *.tex
file di root serta sebuah README.md
, konfigurasi CI YAML di bawah ini (tanpa komentar karena batas karakter) akan:
- Tarik gambar dari repositori DockerHub di atas, ganti
ENTRYPOINT
instruksi apa pun dengan apa-apa (alias shell normal). Ini penting agarscript
bagian tersebut berfungsi, sedangkan anENTRYPOINT
nyaman untuk menjalankan container di desktop Anda. - Ganti
n.a.
dalam\newcommand*{\GitVersion}{n.a.}
dan\newcommand*{\GitShortHash}{n.a.}
dari*.cls
file kelas LaTeX (di akar proyek) dengan nilai aktual, saat ini dari build tersebut. Hal ini memungkinkan metadata VCS dicetak dalam PDF. - Buat LaTeX menjadi PDF hanya dengan menerbitkan
latexmk
. Ini akan menarik instruksinya dari.latexmkrc
, lihat di atas. - Kompilasi PDF dari
README.md
, menggunakanpandoc
, yang sekali lagi digunakanlualatex
untuk konversi. Ini menggunakan template untuk hasil yang lebih cantik. Langkah ini lebih merupakan tipu muslihat / showcase untukpandoc
.
PDF yang dihasilkan adalah artefak dari pipeline CI dan dapat diunduh setelah proses yang berhasil.
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: []
Maaf, saya tidak tahu apa itu CI, tetapi jika Anda memiliki GNU make di mesin Anda, Anda dapat menulis makefile kecil seperti ini:
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)
Contoh dibuat untuk Windows sebagai OS. Alih-alih E: \ miktex-portable ... \ menyesuaikan jalur yang sesuai dengan instalasi Anda. Jika Anda memiliki GNU / Linux Anda dapat mengatur $ PATH sedemikian rupa sehingga Anda tidak perlu menentukan path lengkap ke executable (misalnya, katakan saja 'lualatex $ (FILE)' dll.). Diketahui bahwa daftar referensi dibuat dengan menggunakan biber dan biblatex. Makefile (nama file yang sama) harus ditempatkan di direktori yang sama di mana file * .tex Anda berada. Kemudian, Anda hanya perlu memasukkan 'make' di terminal baris perintah. Demikian juga 'make clean' dan 'make cleanall' dapat membantu Anda merapikan direktori Anda.
Apa yang akhirnya saya lakukan adalah mendaftar latexmk
ke CI dan menerapkan aturan tambahan latexmk
untuk membantu glossaries
paket tersebut.
Build otomatis melakukan hal berikut setelah menyiapkan lingkungan build dan image buruh pelabuhan miktex:
mpm --install=latexmk
Saat membuat dokumen, perintah berikut digunakan:
latexmk -r "<path-to-rc-file>/.latexmkrc" -lualatex -latexoption="-interaction=nonstopmode"
The .latexmkrc
file dalam submodule Git dibagi antara semua repositori dokumen kami di mana kami juga memiliki kelas dokumen kami bersama dll
Berikut isinya .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;
}
diambil dari sini .
Hasil akhirnya memastikan pengalaman pembuatan yang konsisten terlepas dari dokumen dan kontennya. Pendekatan ini juga fleksibel dan dapat diperluas yang memungkinkan penggunaan rantai alat yang sama persis dari kontainer buruh pelabuhan lokal saat menulis.