Minitoc 关于科马文 (scrbook) 课程,包含希腊语

Minitoc 关于科马文 (scrbook) 课程,包含希腊语

我正在用 koma-script (scrbook) 类制作一本书,我需要在每个部分和章节的开头添加一个 minitoc。我找到了一个解决方案通过这篇文章,但是它不适用于来自 babel 的希腊语。

这是一个简单的例子:

\documentclass[fontsize=10pt,open=any,twocolumn]{scrbook}[2019/10/12]% needs version 3.27 or newer

\usepackage[greek]{babel}

\providecommand*{\Ifstr}{\ifstr}% added because of changes in upcoming KOMA-Script version 3.28 and \ifstr replaced by \Ifstr in the code (see https://komascript.de/faq_deprecatedif) 
\usepackage{blindtext}
\usepackage{xcolor}

\usepackage{scrwfile}% avoid trouble with the limited number of write handles
\usepackage{xpatch}

\colorlet{partcolor}{blue}
\addtokomafont{partprefix}{\color{partcolor}}% change color of part prefix
\addtokomafont{part}{\normalcolor}% use normal color for part title
%\renewcommand*\partformat{\partname~\thepart}% if you want to remove \autodot from the definition
\RedeclareSectionCommand[
  tocdynnumwidth=true,%
  tocbeforeskip=1em,
  tocindent=1.5em
]{part}
\RedeclareSectionCommand[
  beforeskip=0pt,
  afterindent=false,
  afterskip=2\baselineskip,
  tocdynnumwidth,
  tocbeforeskip=1em plus 1pt minus 1pt,% add some glue
  toclinefill=\TOCLineLeaderFill
]{chapter}
\RedeclareSectionCommand[
  beforeskip=\baselineskip,
  afterindent=false,
  afterskip=.5\baselineskip,
  tocindent=1.5em,
  tocnumwidth=3.5em
]{section}
\RedeclareSectionCommand[
  beforeskip=.75\baselineskip,
  afterindent=false,
  afterskip=.5\baselineskip,
  tocindent=3.8em,
  tocnumwidth=4em
]{subsection}
\RedeclareSectionCommand[
  beforeskip=.5\baselineskip,
  afterindent=false,
  afterskip=.25\baselineskip,
  tocindent=7em,
  tocnumwidth=4.1em
]{subsubsection}
\RedeclareSectionCommand[
  tocindent=10em,
  tocnumwidth=5em
]{paragraph}
\RedeclareSectionCommand[
  tocindent=12em,
  tocnumwidth=6em
]{subparagraph}

\RedeclareSectionCommands
  [tocpagenumberwidth=3em]
  {part,chapter,section,subsection,paragraph,subparagraph}

% https://tex.stackexchange.com/a/359758
% https://tex.stackexchange.com/a/502077
\makeatletter
\newif\ifuseparttoc
\newcommand*{\parttoc}[1][\thepart]{% new command to generate and show a chapter toc
  \useparttoctrue% switch on part-toc-entries
  \edef\ext@parttoc{tcp#1}% extension of the part-toc-file, e.g., tcpI
  \DeclareNewTOC[
    listname=Obsah,
    %unset=onecolumn% if the part toc should use twocolumn
  ]{\ext@parttoc}% declare a new toc file
  \begingroup
    \value{tocdepth}=\chaptertocdepth% we want entries down to chapter
    \listoftoc{\ext@parttoc}% show the toc with header
  \endgroup
}
\xapptocmd\addtocentrydefault{% patch the KOMA-Script's generic toc entry generator
  \ifuseparttoc% if part toc entries should be generated
    \expandafter\tocbasic@addxcontentsline\expandafter{\ext@parttoc}{#1}{#2}{#3}% do it
  \fi
}{}{}
\xpretocmd\part{\useparttocfalse}{}{}% entries in part toc are automatically switched off at start of \part
\newif\ifusechaptertoc% Switch to tell \addtocentrydefault to not only make entries to the toc-file but also to the current section-toc-file
\newcommand*{\chaptertoc}[2][\thechapter]{% new command to generate and show a chapter toc
  \usechaptertoctrue% switch on chapter-toc-entries
  \edef\ext@chaptoc{tcc#1}% extension of the chapter-toc-file, e.g., tcc1
  \DeclareNewTOC{\ext@chaptoc}% declare a new toc file
  %\addsec*{Contents}% header of the chaptertoc
  \setchapterpreamble{%
    \begin{minipage}{\linewidth}
      \hrulefill\par
      \value{tocdepth}=\subsectiontocdepth% we want entries down to subsection
      \listoftoc*{\ext@chaptoc}% show the toc without header
    \end{minipage}%
    \par\bigskip\nobreak\noindent\hrulefill\par
    \bigskip\noindent\ignorespaces% add some vertical space after the toc and do not indent the following text
  }%
}
\xapptocmd\addtocentrydefault{% patch the KOMA-Script's generic toc entry generator
  \ifusechaptertoc% if chapter toc entries should be generated
    \Ifstr{#1}{chapter}{}
      {\expandafter\tocbasic@addxcontentsline\expandafter{\ext@chaptoc}{#1}{#2}{#3}}% do it
  \fi
}{}{}
\xpretocmd\chapter{\usechaptertocfalse}{}{}% entries in chapter toc are automatically switched off at start of \chapter
\xpretocmd\part{\usechaptertocfalse}{}{}% entries in chapter toc are automatically switched off at start of \part
\makeatother

\newcommand\setchaptertoc[1][]{%
  \Ifstr{#1}{}
    {\AddtoOneTimeDoHook{heading/preinit/chapter}{\chaptertoc}}
    {\AddtoOneTimeDoHook{heading/preinit/chapter}{\chaptertoc[#1]}}%
}

\setcounter{tocdepth}{\partnumdepth}% depth of TOC
\begin{document}
\tableofcontents

\setcounter{page}{3000}
\setcounter{chapter}{100}
\setcounter{part}{5080}

\part{Part I}
\parttoc

\setchaptertoc
\chapter{My chapter I}
\section{My first section}
\blindtext
\subsection{My first subsection}
\blindtext
\section{My second section}
\blindtext

\chapter{My chapter II}
\chapter{My chapter II}
\chapter{My chapter III}
\chapter{My chapter IV}
\chapter{My chapter V}
\chapter{My chapter VI}
\chapter{My chapter VII}
\chapter{My chapter VIII}
\chapter{My chapter IX}
\chapter{My chapter X}
\chapter{My chapter XI}
\chapter{My chapter XII}
\chapter{My chapter XIII}
\chapter{My chapter XIV}
\chapter{My chapter XV}
\chapter{My chapter XVI}
\chapter{My chapter XVII}
\chapter{My chapter XVIII}
\chapter{My chapter XIX}
\chapter{My chapter XX}
\chapter{My chapter XXI}
\chapter{My chapter XXII}
\chapter{My chapter XXIII}
\chapter{My chapter XXIV}
\chapter{My chapter XXVI}
\chapter{My chapter XXVII}
\chapter{My chapter XXVIII}
\chapter{My chapter XXIX}
\chapter{My chapter XXX}

\part{Part II}
\parttoc
\setchaptertoc
\chapter{My chapter I}
\section{My first section}
\blindtext
\subsection{My first subsection}
  \blindtext
\section{My second section}
\blindtext:

\end{document}

这会导致错误

! Incomplete \iffalse; all text was ignored after line 127.
<inserted text> 
                \fi

使用 polutonikogreek 语言而不是希腊语会出现同样的错误。我怀疑这与KomaScript 中的 Ifstr\ifstr 问题但当希腊语出现在整本书中时,它就不能承受这种 minitoc 方法吗?我需要用希腊语写一些句子,而不是整本书。

答案1

由于\usepackage[greek]{babel}PDFLaTeX\@Roman包含字体切换命令,因此它不再可扩展,也不适合用作文件名的一部分。一个简单的建议是,不要使用,\thepart而是\the\c@part构建部分内容辅助文件的扩展名:

\documentclass[fontsize=10pt,open=any,twocolumn]{scrbook}

\usepackage[greek]{babel}

\usepackage{blindtext}

\usepackage{scrwfile}% avoid trouble with the limited number of write handles
\usepackage{xpatch}

% https://tex.stackexchange.com/a/359758
% https://tex.stackexchange.com/a/502077
\makeatletter
\newif\ifuseparttoc
\newcommand*{\parttoc}[1][\the\c@part]{% CHANGED
  \useparttoctrue% switch on part-toc-entries
  \edef\ext@parttoc{tcp#1}% extension of the part-toc-file, e.g., tcp1
  \DeclareNewTOC[
    listname=Obsah,
    %unset=onecolumn% if the part toc should use twocolumn
  ]{\ext@parttoc}% declare a new toc file
  \begingroup
    \value{tocdepth}=\chaptertocdepth% we want entries down to chapter
    \listoftoc{\ext@parttoc}% show the toc with header
  \endgroup
}
\xapptocmd\addtocentrydefault{% patch the KOMA-Script's generic toc entry generator
  \ifuseparttoc% if part toc entries should be generated
    \expandafter\tocbasic@addxcontentsline\expandafter{\ext@parttoc}{#1}{#2}{#3}% do it
  \fi
}{}{}
\xpretocmd\part{\useparttocfalse}{}{}% entries in part toc are automatically switched off at start of \part
\newif\ifusechaptertoc% Switch to tell \addtocentrydefault to not only make entries to the toc-file but also to the current section-toc-file
\newcommand*{\chaptertoc}[2][\thechapter]{% new command to generate and show a chapter toc
  \usechaptertoctrue% switch on chapter-toc-entries
  \edef\ext@chaptoc{tcc#1}% extension of the chapter-toc-file, e.g., tcc1
  \DeclareNewTOC{\ext@chaptoc}% declare a new toc file
  %\addsec*{Contents}% header of the chaptertoc
  \setchapterpreamble{%
    \begin{minipage}{\linewidth}
      \hrulefill\par
      \value{tocdepth}=\subsectiontocdepth% we want entries down to subsection
      \listoftoc*{\ext@chaptoc}% show the toc without header
    \end{minipage}%
    \par\bigskip\nobreak\noindent\hrulefill\par
    \bigskip\noindent\ignorespaces% add some vertical space after the toc and do not indent the following text
  }%
}
\xapptocmd\addtocentrydefault{% patch the KOMA-Script's generic toc entry generator
  \ifusechaptertoc% if chapter toc entries should be generated
    \Ifstr{#1}{chapter}{}
      {\expandafter\tocbasic@addxcontentsline\expandafter{\ext@chaptoc}{#1}{#2}{#3}}% do it
  \fi
}{}{}
\xpretocmd\chapter{\usechaptertocfalse}{}{}% entries in chapter toc are automatically switched off at start of \chapter
\xpretocmd\part{\usechaptertocfalse}{}{}% entries in chapter toc are automatically switched off at start of \part
\makeatother

\newcommand\setchaptertoc[1][]{%
  \IfArgIsEmpty{#1}
    {\AddtoOneTimeDoHook{heading/preinit/chapter}{\chaptertoc}}
    {\AddtoOneTimeDoHook{heading/preinit/chapter}{\chaptertoc[#1]}}%
}

\setcounter{tocdepth}{\partnumdepth}% depth of TOC
\begin{document}
\tableofcontents

\part{Part I}
\parttoc
\setchaptertoc
\chapter{My chapter I}
\section{My first section}
\blindtext
\subsection{My first subsection}
\blindtext
\section{My second section}
\blindtext

\chapter{My chapter II}
\chapter{My chapter II}
\chapter{My chapter III}

\part{Part II}
\parttoc
\setchaptertoc
\chapter{My chapter I}
\section{My first section}
\blindtext
\subsection{My first subsection}
  \blindtext
\section{My second section}
\blindtext:

\end{document}

但请注意:如果您在某处切换了零件编号,这将不起作用。但是,由于可选参数的缘故,\parttoc您可以选择使用原始定义并使用可选参数,例如\parttoc[I]\parttoc[examples]

另一种选择是\ensureascii在构建文件扩展名时进行本地重新定义(对章节也执行此操作):

\documentclass[fontsize=10pt,open=any,twocolumn]{scrbook}
\usepackage[greek]{babel}

\usepackage{blindtext}

\usepackage{scrwfile}% avoid trouble with the limited number of write handles
\usepackage{xpatch}

% https://tex.stackexchange.com/a/359758
% https://tex.stackexchange.com/a/502077
\makeatletter
\newif\ifuseparttoc
\newcommand*{\parttoc}[1][\thepart]{% new command to generate and show a part toc
  \useparttoctrue% switch on part-toc-entries
  \begingroup
    \let\ensureascii\@firstofone% Don't switch encoding or font
    \xdef\ext@parttoc{tcp#1}% extension of the part-toc-file, e.g., tcpI
  \endgroup
  \DeclareNewTOC[
    listname=Obsah,
    %unset=onecolumn% if the part toc should use twocolumn
  ]{\ext@parttoc}% declare a new toc file
  \begingroup
    \value{tocdepth}=\chaptertocdepth% we want entries down to chapter
    \listoftoc{\ext@parttoc}% show the toc with header
  \endgroup
}
\xapptocmd\addtocentrydefault{% patch the KOMA-Script's generic toc entry generator
  \ifuseparttoc% if part toc entries should be generated
    \expandafter\tocbasic@addxcontentsline\expandafter{\ext@parttoc}{#1}{#2}{#3}% do it
  \fi
}{}{}
\xpretocmd\part{\useparttocfalse}{}{}% entries in part toc are automatically switched off at start of \part
\newif\ifusechaptertoc% Switch to tell \addtocentrydefault to not only make entries to the toc-file but also to the current section-toc-file
\newcommand*{\chaptertoc}[2][\thechapter]{% new command to generate and show a chapter toc
  \usechaptertoctrue% switch on chapter-toc-entries
  \begingroup
    \let\ensureascii\@firstofone% Don't switch encoding or font
    \xdef\ext@chaptoc{tcc#1}% extension of the chapter-toc-file, e.g., tcc1
  \endgroup
  \DeclareNewTOC{\ext@chaptoc}% declare a new toc file
  %\addsec*{Contents}% header of the chaptertoc
  \setchapterpreamble{%
    \begin{minipage}{\linewidth}
      \hrulefill\par
      \value{tocdepth}=\subsectiontocdepth% we want entries down to subsection
      \listoftoc*{\ext@chaptoc}% show the toc without header
    \end{minipage}%
    \par\bigskip\nobreak\noindent\hrulefill\par
    \bigskip\noindent\ignorespaces% add some vertical space after the toc and do not indent the following text
  }%
}
\xapptocmd\addtocentrydefault{% patch the KOMA-Script's generic toc entry generator
  \ifusechaptertoc% if chapter toc entries should be generated
    \Ifstr{#1}{chapter}{}
      {\expandafter\tocbasic@addxcontentsline\expandafter{\ext@chaptoc}{#1}{#2}{#3}}% do it
  \fi
}{}{}
\xpretocmd\chapter{\usechaptertocfalse}{}{}% entries in chapter toc are automatically switched off at start of \chapter
\xpretocmd\part{\usechaptertocfalse}{}{}% entries in chapter toc are automatically switched off at start of \part
\makeatother

\newcommand\setchaptertoc[1][]{%
  \IfArgIsEmpty{#1}
    {\AddtoOneTimeDoHook{heading/preinit/chapter}{\chaptertoc}}
    {\AddtoOneTimeDoHook{heading/preinit/chapter}{\chaptertoc[#1]}}%
}

\setcounter{tocdepth}{\partnumdepth}% depth of TOC
\begin{document}
\tableofcontents

\part{Part I}
\parttoc
\setchaptertoc
\chapter{My chapter I}
\section{My first section}
\blindtext
\subsection{My first subsection}
\blindtext
\section{My second section}
\blindtext

\chapter{My chapter II}
\chapter{My chapter II}
\chapter{My chapter III}

\part{Part II}
\parttoc
\setchaptertoc
\chapter{My chapter I}
\section{My first section}
\blindtext
\subsection{My first subsection}
  \blindtext
\section{My second section}
\blindtext

\end{document}

这也可以解决与\@Alph或类似的问题\@alph,例如,如果您有附录。

另请注意:我删除了一些代码只是为了进一步简化示例。

但是,与上述建议不同,我建议使用 LuaLaTeX 并删除实验性软件包scrwfile。KOMA-Script 手册还建议使用 LuaLaTeX 来避免“没有空间进行新写入”的问题。

相关内容