提高 LuaLaTeX 编译速度,拥有 2525 个棋盘图

提高 LuaLaTeX 编译速度,拥有 2525 个棋盘图

我想创建一本包含 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 秒因此速度相当慢(并且占用大量内存)。

相关内容