![提高 LuaLaTeX 编译速度,拥有 2525 个棋盘图](https://linux22.com/image/474135/%E6%8F%90%E9%AB%98%20LuaLaTeX%20%E7%BC%96%E8%AF%91%E9%80%9F%E5%BA%A6%EF%BC%8C%E6%8B%A5%E6%9C%89%202525%20%E4%B8%AA%E6%A3%8B%E7%9B%98%E5%9B%BE.png)
我想创建一本包含 2525 个棋位的书。我已经定义了应该打印图表的 \tacticboard 命令。但是,由于大小问题,使用 LuaLaTeX 生成 PDF 的时间太长(例如,4 小时后没有生成 PDF)。如何改进执行和 \tacticboard 命令?
我在下面提供了必要部分的代码:
\documentclass[paper=8.27in:11.69in,DIV=calc,fontsize=12pt]{scrbook}
\usepackage[includehead, includefoot, inner=0.65in, outer=0.4in, top=0.65in, bottom=0.65in]{geometry}
%\documentclass[headings=openany,paper=165mm:240mm,DIV=calc]{scrbook}
%\usepackage[includehead, includefoot, left=20mm, right=20mm, top=17.5mm, bottom=17.5mm]{geometry}
\usepackage{pdfpages}
\usepackage{enumitem}
\usepackage{ragged2e}
\usepackage{multicol}
\usepackage{fancyhdr}
\usepackage{ulem}
\usepackage{tocloft}
\fancyhf{}
\pagestyle{fancy}
\usepackage{titlesec}
\usepackage{titletoc}
\usepackage{imakeidx}
\titleformat{name=\section, numberless}[display]
{\LARGE\bfseries}{}{0pt}{\centering{\large}}
\titleformat{\part}[display]
{\Huge\bfseries}{}{0pt}{\centering{\thepart}}
\titleformat{name=\part, numberless}[display]
{\Huge\bfseries}{}{0pt}{\centering{\Huge}}
\titleformat{\chapter}[display]
{\Huge\bfseries}{}{0pt}{\centering{\thechapter . }}
\titleformat{name=\chapter, numberless}[display]
{\Huge\bfseries}{}{0pt}{\centering{\Large}}
\renewcommand{\chaptermark}[1]{
\markboth{#1}{}}
\pagestyle{fancy}
\renewcommand{\headrulewidth}{0.0pt}
\fancyfoot[LE, RO]{\thepage}
\assignpagestyle{\part}{empty}
\usepackage{xskak}
\usepackage{texmate}
\usepackage{array}
\usepackage{amssymb}
\setcounter{secnumdepth}{55}
\setcounter{tocdepth}{55}
\newcounter{diagrams}
\newcommand\printdiagrams{\footnotesize\refstepcounter{diagrams}\thediagrams}
\setchessboard{labelfontsize=0.5em, showmover=true, moverstyle=triangle, boardfontsize=14pt}
\newcommand\tacticboard[2][]{%
\noindent
\begin{minipage}[t]{0.3\textwidth}
\vfill\strut\scriptsize\vspace{-0.5em}\hspace{2.3em} \printdiagrams \hfill #1\hspace{1.9em} \vspace{-1em}
\par\centering\chessboard[#2]\vfill\vspace{2.1em}
\end{minipage}
\hfill\ignorespaces
}
\begin{document}
\renewcommand{\cftpartfont}{\bfseries\rmfamily\Huge\vspace{0.5em}}
\renewcommand{\cftsecfont}{\rmfamily\Large\vspace{0.25em}}
\renewcommand{\cftpartpagefont}{\bfseries\rmfamily\Huge}
\renewcommand{\cftsecpagefont}{\rmfamily\Large}
\renewcommand\thepart{\Roman{part}. }
\renewcommand{\contentsname}{\hspace*{\fill}\rmfamily\bfseries\huge Contents\hspace*{\fill}}
\setlength\parindent{0pt}
\part{Positions}
\fancyhead[C]{I. Positions}
\renewcommand{\headrulewidth}{0.2pt}
\tacticboard[L-0]{setfen=8/8/8/8/8/1K4Q1/7p/6k1 b - - 0 1, moverlift=-1.9ex, movershift=-8.6ex}
\tacticboard[L-0]{setfen=8/8/8/6K1/8/6Q1/5p2/6k1 b - - 0 1, moverlift=-1.9ex, movershift=-8.6ex}
...
\tacticboard[L-0]{setfen=8/3k1qP1/7K/7P/8/8/8/8 w - - 0 1, moverlift=16.6ex, movershift=-8.6ex}
\tacticboard[L-0]{setfen=3q4/1P6/K1k5/P7/8/8/8/8 w - - 0 1, moverlift=16.6ex, movershift=-8.6ex}
\end{document}
最诚挚的问候,
答案1
您\tacticboard
只是做了一个minipage
粘合hfill
,所以如果正如您所表明的那样,您有 2000 个这样的代码彼此连接,那么您的整个文档将被设置为一个段落并保存在内存中直到最后,然后 tex 的换行符会将它们分开。
正如您事先知道的,每行有三个,每三行放置一个空白行或测试值\value{diagrams}
并使用\par
它是 3 的倍数。
\documentclass[paper=8.27in:11.69in,DIV=calc,fontsize=12pt]{scrbook}
\usepackage[includehead, includefoot, inner=0.65in, outer=0.4in, top=0.65in, bottom=0.65in]{geometry}
%\documentclass[headings=openany,paper=165mm:240mm,DIV=calc]{scrbook}
%\usepackage[includehead, includefoot, left=20mm, right=20mm, top=17.5mm, bottom=17.5mm]{geometry}
\usepackage{pdfpages}
\usepackage{enumitem}
\usepackage{ragged2e}
\usepackage{multicol}
\usepackage{fancyhdr}
\usepackage{ulem}
\usepackage{tocloft}
\fancyhf{}
\pagestyle{fancy}
\usepackage{titlesec}
\usepackage{titletoc}
\usepackage{imakeidx}
\titleformat{name=\section, numberless}[display]
{\LARGE\bfseries}{}{0pt}{\centering{\large}}
\titleformat{\part}[display]
{\Huge\bfseries}{}{0pt}{\centering{\thepart}}
\titleformat{name=\part, numberless}[display]
{\Huge\bfseries}{}{0pt}{\centering{\Huge}}
\titleformat{\chapter}[display]
{\Huge\bfseries}{}{0pt}{\centering{\thechapter . }}
\titleformat{name=\chapter, numberless}[display]
{\Huge\bfseries}{}{0pt}{\centering{\Large}}
\renewcommand{\chaptermark}[1]{%<<
\markboth{#1}{}}
\pagestyle{fancy}
\renewcommand{\headrulewidth}{0.0pt}
\fancyfoot[LE, RO]{\thepage}
\assignpagestyle{\part}{empty}
\usepackage{xskak}
\usepackage{texmate}
\usepackage{array}
\usepackage{amssymb}
\setcounter{secnumdepth}{55}
\setcounter{tocdepth}{55}
\newcounter{diagrams}
\newcommand\printdiagrams{\footnotesize\refstepcounter{diagrams}\thediagrams}
\setchessboard{labelfontsize=0.5em, showmover=true, moverstyle=triangle, boardfontsize=14pt}
\newcommand\tacticboard[2][]{%
\noindent
\begin{minipage}[t]{0.3\textwidth}
\vfill\strut\scriptsize\vspace{-0.5em}\hspace{2.3em} \printdiagrams \hfill #1\hspace{1.9em} \vspace{-1em}
\par\centering\chessboard[#2]\vfill\vspace{2.1em}
\end{minipage}%
\ifnum\numexpr(\value{diagrams}/3)*3=\value{diagrams}%
\par
\else
\hfill
\fi
\ignorespaces
}
\begin{document}
\renewcommand{\cftpartfont}{\bfseries\rmfamily\Huge\vspace{0.5em}}
\renewcommand{\cftsecfont}{\rmfamily\Large\vspace{0.25em}}
\renewcommand{\cftpartpagefont}{\bfseries\rmfamily\Huge}
\renewcommand{\cftsecpagefont}{\rmfamily\Large}
\renewcommand\thepart{\Roman{part}. }
\renewcommand{\contentsname}{\hspace*{\fill}\rmfamily\bfseries\huge Contents\hspace*{\fill}}
\setlength\parindent{0pt}
\part{Positions}
\fancyhead[C]{I. Positions}
\renewcommand{\headrulewidth}{0.2pt}
\tacticboard[L-0]{setfen=8/8/8/8/8/1K4Q1/7p/6k1 b - - 0 1, moverlift=-1.9ex, movershift=-8.6ex}
\tacticboard[L-0]{setfen=8/8/8/6K1/8/6Q1/5p2/6k1 b - - 0 1, moverlift=-1.9ex, movershift=-8.6ex}
\tacticboard[L-0]{setfen=8/3k1qP1/7K/7P/8/8/8/8 w - - 0 1, moverlift=16.6ex, movershift=-8.6ex}
\tacticboard[L-0]{setfen=3q4/1P6/K1k5/P7/8/8/8/8 w - - 0 1, moverlift=16.6ex, movershift=-8.6ex}
\tacticboard[L-0]{setfen=3q4/1P6/K1k5/P7/8/8/8/8 w - - 0 1, moverlift=16.6ex, movershift=-8.6ex}
\tacticboard[L-0]{setfen=3q4/1P6/K1k5/P7/8/8/8/8 w - - 0 1, moverlift=16.6ex, movershift=-8.6ex}
\tacticboard[L-0]{setfen=3q4/1P6/K1k5/P7/8/8/8/8 w - - 0 1, moverlift=16.6ex, movershift=-8.6ex}
\tacticboard[L-0]{setfen=3q4/1P6/K1k5/P7/8/8/8/8 w - - 0 1, moverlift=16.6ex, movershift=-8.6ex}
\tacticboard[L-0]{setfen=3q4/1P6/K1k5/P7/8/8/8/8 w - - 0 1, moverlift=16.6ex, movershift=-8.6ex}
\tacticboard[L-0]{setfen=3q4/1P6/K1k5/P7/8/8/8/8 w - - 0 1, moverlift=16.6ex, movershift=-8.6ex}
\tacticboard[L-0]{setfen=3q4/1P6/K1k5/P7/8/8/8/8 w - - 0 1, moverlift=16.6ex, movershift=-8.6ex}
\tacticboard[L-0]{setfen=3q4/1P6/K1k5/P7/8/8/8/8 w - - 0 1, moverlift=16.6ex, movershift=-8.6ex}
\end{document}
使用 pdftex 和此答案中的代码,修改最后一次\tacticboard
重复,因此有 2,367 个板,然后使用在 Windows 上的 wsl2 中运行的 texlive 2024 linux:
使用 pdftex,我得到了 233 页上的 2,367 个图板3 分 11 秒。
使用与 lualatex 相同的文件是4 分 6 秒,因此比 pdftex 慢,但比 4 小时少很多。
如果不添加\par
每三个板,则完整文档不会使用 pdftex 产生任何输出:
! TeX capacity exceeded, sorry [main memory size=5000000].
因为它无法在内存中保存所有板子。
Luatex 使用动态内存分配,因此成功了,但是6 分 12 秒因此速度相当慢(并且占用大量内存)。