在 ToC 中插入不同图片的问题

在 ToC 中插入不同图片的问题

我正在使用titletoc包来格式化我的目录。我希望我的目录如下图所示

在此处输入图片描述

我不知道是否有可能在 LaTeX 中实现这种目录样式,但在目录中插入图形无疑是这项工作中最困难的部分。所以我尝试了titletoc文档定义所建议的技巧

\newcommand{\figureintoc}[1]{
\begin{figure}
\includegraphics{#1}%
\end{figure}}

但是我在编译时收到此错误消息:

失控参数?{!段落在 \@writefile 完成之前结束。 \par

l.11 ...le{\figureintoc {pitagoras.png}}{\par }

我不知道现在该怎么办。这是我的 MWE:

\documentclass[openright]{book}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{geometry}
\usepackage{xparse}
\usepackage{graphicx}
\usepackage[explicit]{titlesec}
\usepackage[many]{tcolorbox}
\usepackage{emptypage}
\usepackage{lipsum}
\usepackage{lmodern}
\usepackage{titletoc,titleps}

\titlecontents{part}%
    [0pt]
    {\bfseries\protect\addvspace{15pt}\titlerule\addvspace{1.5ex}}
    {}
    {\MakeUppercase}
    {\hfill\thecontentspage}
    [\addvspace{0.7ex}\titlerule\addvspace{1.5ex}]

\titlecontents{chapter}
    [0pt]                    
    {\bfseries\protect\addvspace{15pt}\titlerule\addvspace{1.5ex}}
    {Chapter~\thecontentslabel.\hspace{1em}\MakeUppercase}
    {}
    {\hfill\thecontentspage}
    [\addvspace{0.7ex}\titlerule\addvspace{1.5ex}]

\titlecontents{section}
    [2em]              
    {}                 
    {\textbf{\thecontentslabel}\hspace{1em}} 
    {\hspace*{4em}\bfseries\itshape}    
    {\hfill\thecontentspage}

\titlecontents*{subsection}
    [1.0cm]             
    {}                  
    {%                  
    {\textbf{\thecontentslabel}\hspace{1em}}%
    }%
    {\hspace*{4em}\bfseries\itshape}
    {\hfill\thecontentspage}

\setcounter{secnumdepth}{3}

\newcommand{\figureintoc}[1]{
    \begin{figure}
    \includegraphics{#1}%
    \end{figure}}

\begin{document}
\tableofcontents

\chapter{Foo chapter}
\addtocontents{\protect\figureintoc{pitagoras.png}}

\lipsum[1]

\section{Foo section}

\lipsum[2]

\section{Foofoo section}

\lipsum[3]
\end{document}

希望您能帮助我!我将非常感激您提供的任何帮助。

答案1

这是一个非常不同的方法,因为代码https://tex.stackexchange.com/a/330885/36296有非常不同的限制。或者我只是变得更聪明,不再那么痴迷framed.sty

这是第二个版本:第一个版本使用了多行\parshape,但很难考虑多行的长标题;每次执行\par并使用它\prevgraf检查是否已到达图片底部更简单。因此新版本使用\parshapen=1规范。

编辑:好吧,我终于完全放弃了这个\parshape东西,只使用了 的调整\leftskip。我还借此机会简化了章节标题的代码,因为它来自一个\parskip积极的、不需要修改的上下文,因此看起来不必要地奇怪。并且,我添加了包的使用needspace以确保页面底部有足够的空间用于图形。当前代码将很容易将章节标题留在页面底部,如果希望它粘贴到下面的图形上,那么这是可能的,但需要将一些代码从部分样式移动到章节样式,同时考虑到在示例中命令\setsectocdeco已经在 之前使用过\chapter。但使用当前代码,它们也可以在 之后使用,\chapter因为我们不必担心将章节标题粘贴到图形上。

此外,我还添加了更好的章节编号和页码处理,以便长标题不会在后续行中出现在它们下面(这是个人喜好问题)。最后一章没有相关图形,以表明它在这种情况下也能正常工作。

笔记:在下面的图片中,装饰第二章的 jpeg 在正方形周围有一些空白,这解释了为什么它看起来向右和向下移动。这是来自 jpeg 而不是 LaTeX 代码。

% Image credits:

% Par Mallowtek — Travail personnel, CC BY-SA 3.0,
% https://commons.wikimedia.org/w/index.php?curid=20438883

% Par Jean-Luc W — Travail personnel, CC BY-SA 3.0,
% https://commons.wikimedia.org/w/index.php?curid=10002415

\documentclass[a4paper]{book}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{geometry}
\usepackage{graphicx}
%\usepackage{xcolor}
\usepackage{etoc}
\usepackage{mwe}
\usepackage{needspace}

%\usepackage[linktoc=all]{hyperref}% it works

\newbox\TOCbox

\makeatletter

\etocsetstyle{chapter}
   {\sffamily\parskip\z@skip\parindent\z@}
   {\allowbreak
    \rule{\linewidth}{1pt}\par
    \nobreak Chapter \etocnumber. \MakeUppercase{\etocname}\par
    \nobreak
    \rule[\dimexpr.4\baselineskip-1pt\relax]{\linewidth}{1pt}\par
    }
   {}
   {}

% loop facilities not needed after all
% \usepackage{xinttools}

\def\TOCleftsep{1.25cm}
%\def\TOCrightsep{1cm}
\def\TOCnumwidth{0.75cm}
\def\TOCpnumwidth{0.5cm}

\etocsetstyle {section}
   {\leftskip\z@skip\parfillskip\z@skip
    \rightskip\TOCpnumwidth\relax
    {\Gin@drafttrue\setbox\TOCbox\hbox{\sectocdeco}%
     \@tempcnta\ht\TOCbox
     \advance\@tempcnta\m@ne
     \@tempcntb\baselineskip
     \divide\@tempcnta\@tempcntb
   \needspace{\@tempcnta\baselineskip}%
     \advance\@tempcnta\@ne
     \xdef\TOC@shiftedlines{\the\@tempcnta}%
     \dimen@\wd\TOCbox
     \advance\dimen@\TOCleftsep\relax
     \ifdim\dimexpr\ht\TOCbox+\dp\TOCbox=\z@
        \gdef\TOC@shiftedlines{0}%
     \else
        \xdef\TOC@leftskip{\the\dimen@}%
     \fi }%
   }
   {\ifnum\TOC@shiftedlines>\z@
        \leftskip\TOC@leftskip\relax
        \etociffirst
    {\leavevmode\llap{{\raisebox{\dimexpr-\height+\ht\strutbox\relax}
           [\ht\strutbox][\z@]{\sectocdeco}}\hspace{\TOCleftsep}}}{}%
    \else
        \leftskip\TOCnumwidth\relax
    \fi
    \leavevmode
    \llap{\makebox[\TOCnumwidth][l]{\etocnumber}}%
    \etocname\nobreak\hfill\rlap{\makebox[\rightskip][r]{\etocpage}}%
    \par}
   {\edef\TOC@shiftedlines{\the\numexpr\TOC@shiftedlines-\prevgraf}}
   {\leftskip\z@skip\rightskip\z@skip\parfillskip\@flushglue
    \count@\TOC@shiftedlines\relax
    \loop\ifnum\count@>\z@\leavevmode\par\advance\count@\m@ne\repeat}

\makeatother

\newcommand*{\setsectocdeco}[1]%
  {\addtocontents{toc}{\def\string\sectocdeco{\protect#1}}}   

%\renewcommand{\etocaftertochook}{\thispagestyle{empty}}

\begin{document}

\tableofcontents

\setsectocdeco{\includegraphics[height=2cm]{Pythagore_1}}

\chapter{Foo}

\section{Foo}
\section{This is a section with a long long long long long long long long long long long long long long long long name}

\setsectocdeco{\includegraphics[height=3cm]{Pythagore_2}}

\chapter{Bar}

\section{Foo}
\section{Foofoo}
\section{Foo}
\section{Foofoo}
\section{This is a section with a long long long long long long long long long long long long long long long long name}
\section{Foo}
\section{Foofoo}
\section{Foo}
\section{Foofoo}


% test of needspace
%\addtocontents{toc}{\string\vspace{1.1cm}}
%\setsectocdeco{\includegraphics[height=5cm]{example-image-c}}

% test with empty decor
\setsectocdeco{}

\chapter{FooBar}
\section{Foo}
\section{Foofoo}
\section{Foo}
\section{Foofoo}
\section{Foo}
\section{Foofoo}

\end{document}

在此处输入图片描述

相关内容