我正在使用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
检查是否已到达图片底部更简单。因此新版本使用\parshape
行n=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}