Я пишу шаблон, чтобы узнать немного больше о LaTeX, и я не удовлетворен своей \chapter{}
командой. Я попытался сделать мини-TOC с номером главы, как на рисунке ниже:
Однако мне нужны некоторые конкретные изменения, чтобы сделать этот вариант идеальным для меня.
Во-первых, мне очень некомфортно из-за разного расстояния справа и слева, и я не знаю, как это исправить, более того, я хочу, чтобы расстояние со всех сторон было одинаковым, а не как на изображении ниже:
Во-вторых, мне бы очень хотелось, чтобы содержимое мини-оглавления адаптировалось к размеру прямоугольника, в котором оно находится, чтобы чем больше в нем разделов, тем мельче был шрифт, чтобы вместить все разделы.
В-третьих, я получаю предупреждение,
Overfull \hbox (1.22324pt too wide) in paragraph at lines 15--15
когда ввожу команду\chapter{Entering the commands}
, и понятия не имею, почему.
Ну, мой MWE такой:
Мой .cls
файл:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{solutionclass}[2023/03/03 My Custom LaTeX Class for exercise solutions]
\LoadClass[a4paper, twoside, 11pt]{book}
% LANGUAGE AND ENCODING
\RequirePackage[portuguese, english]{babel}
\RequirePackage[utf8]{inputenc}
\RequirePackage[T1]{fontenc}
% TEXT FORMATTING AND MANIPULATION
\RequirePackage{csquotes}
\RequirePackage{mathrsfs}
\RequirePackage{titlesec}
\RequirePackage{lipsum}
% FIGURES, TIKZ AND BOXES
\RequirePackage{graphicx}
\RequirePackage{float}
\RequirePackage{xcolor}
\RequirePackage{tikz}
\RequirePackage{tikz-3dplot}
\RequirePackage{pgfplots}
\RequirePackage[most]{tcolorbox}
% PAGE AND TEXT STYLES
\RequirePackage[colorlinks = true,
urlcolor = LinkColor,
anchorcolor = LinkColor,
citecolor = LinkColor,
filecolor = LinkColor,
linkcolor = LinkColor,
menucolor = LinkColor,
linktocpage = true,
bookmarks = true,
pdfusetitle]{hyperref}
\RequirePackage[top = 2.5cm,
bottom = 3.8cm,
left = 2cm,
right = 2cm,
]{geometry}
\RequirePackage{microtype}
\RequirePackage{titletoc}
\RequirePackage{multicol}
\RequirePackage{lmodern}
\RequirePackage{nameref}
\usetikzlibrary{%
decorations.pathreplacing,
decorations.pathmorphing,
decorations.markings,
shapes.multipart,
shapes.geometric,
arrows.meta,
tikzmark,
fadings,
arrows,
angles,
quotes,
calc,
3d,
}
\pgfplotsset{compat=1.18}
% COLOR SETTINGS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\definecolor{myblack}{HTML}{101010} % PERSONAL BLACK
\definecolor{myorangeI}{HTML}{e93820} % PERSONAL ORANGE I
\definecolor{LinkColor}{HTML}{eb5a00} % PERSONAL ORANGE II
% CHAPTER SETTINGS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\chapterNumberAndMinitoc}{%
\begin{tikzpicture}
\node[%
minimum height = 3.2cm,
text width = 2.5cm,
outer sep = 0pt,
align = center,
fill = myblack,
font = \color{white}\fontsize{80}{90}\selectfont,
] (num) {\thechapter};
\node[%
rotate = 90,
anchor = south,
font = \color{black}\Large\normalfont
] at ([xshift=-3pt] num.west) {\textls[180]{\textsc{List N°}}};
\node[%
minimum height = 3.2cm,% Height of the box
minimum width = 6.2cm,
inner sep = 2.5mm, % The border thickness
align = left, % Text aligning
fill = myblack, % Color background
] at ([xshift=-10.3cm] num.east) {%
\color{white}
\begin{minipage}{0.7552\textwidth} % Control the width of the box
\begin{multicols}{2}
\printcontents[sections]{}{1}{}{}
\end{multicols}
\end{minipage}
};
\end{tikzpicture}%
}
\titleformat{\chapter}[display]
{\normalfont\bfseries\color{myblack}}
{\filleft%
\chapterNumberAndMinitoc}{1em}
{\titlerule[2.5pt]\vspace{3pt}\titlerule\vspace{4pt}\LARGE\textsc}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\patchcmd{\chapter}{%
\if@openright
\cleardoublepage
\else
\clearpage
\fi
}{%
}{}{}
\makeatother
\let\oldsection\section
\renewcommand{\section}[1]{%
\oldsection*{#1}
\phantomsection
\addcontentsline{toc}{section}{#1}
}
Мой .tex
файл:
\documentclass[]{solutionclass}
\pagestyle{plain}
\begin{document}
\makeatletter
\startcontents[sections]
\phantomsection
\chapter{Entering the commands} % Here I have the warning
\makeatother
\section{Unbreakable Form}
\section{Breakable Form}
\section{Using the references}
\section{Equations style}
\section{Additional Boxes}
\section{Additional Commands}
\end{document}
Дополнительные комментарии:
Я удаляю номер каждого раздела, чтобы сохранить чистоту мини-содержания;
Если этот код не работает, возможно, я забыл какую-то информацию в посте, потому что, поскольку пост
.cls
очень большой, я не хотел размещать все так, чтобы это было легко понять, но для меня этот код работает;
Я компилирую с помощью pdfLaTeX.
решение1
Частичный ответ
разное расстояние с правой и левой стороны,
Переполненный \hbox (1.22324pt слишком широко)
я добавил
\titlecontents{section}
[0em]
{}
{}
{}
{\titlerule*[1pc]{.}\contentspage}
Я также добавил inner sep
и outer sep
для расчета доступной ширины для последнего узла с xfp
пакетом
\fpeval{\textwidth-2.5cm-20pt-5mm}pt
- 2,5 см ширина первого узла
- 20pt — высота (поворот на 90) 2-го узла
- 5 мм 2 x внутренняя часть 3-го узла
Добавлен % за конечной мини-страницей
РЕДАКТИРОВАТЬ
Мне бы очень хотелось, чтобы содержимое мини-оглавления адаптировалось к размеру прямоугольника, в котором оно размещено.
Я пользуюсь fitting
библиотекойtcolorbox
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{solutionclass}[2023/03/03 My Custom LaTeX Class for exercise solutions]
\LoadClass[a4paper, twoside, 11pt]{book}
% LANGUAGE AND ENCODING
\RequirePackage[portuguese, english]{babel}
\RequirePackage[utf8]{inputenc}
\RequirePackage[T1]{fontenc}
% TEXT FORMATTING AND MANIPULATION
\RequirePackage{csquotes}
\RequirePackage{mathrsfs}
\RequirePackage{titlesec}
\RequirePackage{lipsum}
% FIGURES, TIKZ AND BOXES
\RequirePackage{graphicx}
\RequirePackage{float}
\RequirePackage{xcolor}
\RequirePackage{tikz}
\RequirePackage{tikz-3dplot}
\RequirePackage{pgfplots}
\RequirePackage[most]{tcolorbox}
% PAGE AND TEXT STYLES
\RequirePackage[colorlinks = true,
urlcolor = LinkColor,
anchorcolor = LinkColor,
citecolor = LinkColor,
filecolor = LinkColor,
linkcolor = LinkColor,
menucolor = LinkColor,
linktocpage = true,
bookmarks = true,
pdfusetitle]{hyperref}
\RequirePackage[top = 2.5cm,
bottom = 3.8cm,
left = 2cm,
right = 2cm,
]{geometry}
\RequirePackage{microtype}
\RequirePackage{titletoc}
\RequirePackage{multicol}
\RequirePackage{lmodern}
\RequirePackage{nameref}
\RequirePackage{xfp}%<--- added
\usetikzlibrary{%
decorations.pathreplacing,
decorations.pathmorphing,
decorations.markings,
shapes.multipart,
shapes.geometric,
arrows.meta,
tikzmark,
fadings,
arrows,
angles,
quotes,
calc,
3d,
}
\pgfplotsset{compat=1.18}
% COLOR SETTINGS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\definecolor{myblack}{HTML}{101010} % PERSONAL BLACK
\definecolor{myorangeI}{HTML}{e93820} % PERSONAL ORANGE I
\definecolor{LinkColor}{HTML}{eb5a00} % PERSONAL ORANGE II
% CHAPTER SETTINGS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\chapterNumberAndMinitoc}{%
\begin{tikzpicture}
\node[%
minimum height = 3.2cm,
text width = 2.5cm,
outer sep = 0pt,
inner sep = 0pt,%<--- added
align = center,
fill = myblack,
font = \color{white}\fontsize{80}{90}\selectfont,
] (num) {\thechapter};
\node[%
minimum height = 20pt,%<--- added
outer sep = 0pt,%<--- added
inner sep = 0pt,%<--- added
rotate = 90,
anchor = south,
font = \color{black}\Large\normalfont
]
(listN)%<--- added
at
(num.west)
{\textls[180]{\textsc{List N°}}};
\node[%
inner sep = 0pt, % The border thickness
outer sep = 0pt,%<--- added
anchor = east,
] at
(listN.north) {%<--- added
%\color{white}
% \begin{minipage}{\fpeval{\textwidth-2.5cm-20pt-5mm}pt} % Control the width of the box
% %\setlength{\columnsep}{0pt}
% \begin{multicols}{2}
% \printcontents[sections]{}{1}{}{}
% \end{multicols}
% \end{minipage}%<--- added DON't FORGET
%%%%%%%%%%%%%% EDIT
\begin{tcolorbox}[
width=\fpeval{\textwidth-2.5cm-20pt}pt,
enhanced,
boxrule=0pt,
sharp corners,
left=2.5mm,
right=2.5mm,
top=2.5mm,
bottom=2.5mm,
valign=center,
colback=myblack,
fit to height=3.2cm,
fit fontsize macros
]
\color{white}
\begin{multicols}{2}
\printcontents[sections]{}{1}{}{}
\end{multicols}
\end{tcolorbox}
};
\end{tikzpicture}%
}
\titleformat{\chapter}[display]
{\normalfont\bfseries\color{myblack}}
{\filleft%
\chapterNumberAndMinitoc}{1em}
{\titlerule[2.5pt]\vspace{3pt}\titlerule\vspace{4pt}\LARGE\textsc}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\patchcmd{\chapter}{%
\if@openright
\cleardoublepage
\else
\clearpage
\fi
}{%
}{}{}
\makeatother
\let\oldsection\section
\renewcommand{\section}[1]{%
\oldsection*{#1}
\phantomsection
\addcontentsline{toc}{section}{#1}
}
%%%%%%%%%%% Added
\titlecontents{section}
[0em]
{\small}
{}
{}
{\titlerule*[1pc]{.}\contentspage}
решение2
Вот мое решение.
В файле .cls я сохраняю пакет xcolor
. Он не нужен, так кактикзпредоставляют доступ к цветам, но таким образом мы можем использовать глобальную опцию, как divpsnames
в классе документа, для доступа к большему количеству названий цветов.
Я добавил marginparwidth = 1.25cm
в опциигеометрияпакет (поэтому есть небольшой запас).
Я сохранил ваш код, чтобы избежать новой страницы в начале новой главы ( \patchcmd{\chapter}{...}
).
Мой код использует TiкБиблиотека Z calc
, но вы уже загрузили ее в свой файл класса, поэтому мне не нужно ее добавлять. Но не забудьте ее не удалять.
В коде, который форматирует название главы (см. \titleformat
), я добавил \fontfamily{cmr}
возможность использовать жирные строчные буквы.
В настройках \titlespacing
я использовал фиксированные длины, но вы можете использовать вместо них растертые длины.
Я установил заголовоксорт(атитулсекконцепция) для straight
того, чтобы сохранить вертикальное пространство перед блоком главы, если только это не верхняя часть страницы. С showframe
опциейгеометрияpackage, на третьем снимке экрана вы можете видеть, что вертикального пространства нет, когда глава начинается в верхней части страницы. Обратите внимание, что если вы не выбрали разрешение на начало главы в середине страницы, установка вертикального пространства, добавленного до 0pt
в \titlespacing
недостаточна. Остается немного места (см.https://github.com/jbezos/titlesec/issues/53), и поскольку автор пакета не исправит эту «ошибку», поскольку она аналогична поведению ядра LaTeX, есть обходной путь:Пакет titlesec добавляет дополнительное пространство поверх \chapter, несмотря на команды, говорящие об обратном.
Итак, если у вас не будет глав, начинающихся в середине страницы, после удаления кода \patchcmd{\chapter}{...}
, вам придется установить (в \titlespacing
)вертикальное пространство передИ 0pt
добавьте этот небольшой код:
\makeatletter % the macro name contains @
\patchcmd{\ttl@mkchap@i}{\vspace*{\@tempskipa}}{}{}{}
\makeatother
В остальной части кода я задал некоторые длины (80% \textwidth
дляминитокблок, 15% \textwidth
дляномер главыблок,внутренний разделительпринадлежащийминитокблок, разделение столбцов.
Если номер главы больше 9, необходимо скорректировать (уменьшить) размер отображаемого числа (во втором месте \node
в коде команды \chapterNumberAndMinitoc
).
Затем я задаю форматирование частичного оглавления.
Затем мы переходим к \chapterNumberAndMinitoc
коду.
У нас есть 4 шага: отображениеминитокблок слева, отображающий фон номера главы справа, с той же высотойминитокbloc, отобразить номер главы в центре и, наконец, отобразить повернутый текст в центре пространства между двумя цветными блоками.
Я удалил ваш код \renewcommand{\section}[1]{...}
.
Обратите внимание, что вы использовали очень темный цвет (названный myblack
) дляминитокbloc, название главы, номер главы, правила главы, но не для повернутого текста. Я оставил черный цвет для повернутого текста.
Чтобы продемонстрировать использование этого класса LaTeX в реальной ситуации, я использовал много поддельного текста сгубная помадапакет (который вы уже загрузили в исходный файл класса). Вы можете настроить некоторые пробелы для частичного оглавления, если вам нужно отобразить номера страниц выше 99 (см. в \titlecontents{p-section}
, и замените {}
на {\contentsmargin{20pt}}
вкод перед, чтобы у вас было место для третьей цифры номера страницы).
Файл solutionclass.cls
:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{solutionclass}[2023/03/15 My Custom LaTeX Class for exercise solutions]
\LoadClass[a4paper, twoside, 11pt]{book}
% LANGUAGE AND ENCODING
\RequirePackage[portuguese, english]{babel}
\RequirePackage[utf8]{inputenc}
\RequirePackage[T1]{fontenc}
% TEXT FORMATTING AND MANIPULATION
\RequirePackage{csquotes}
\RequirePackage{mathrsfs}
\RequirePackage{titlesec}
\RequirePackage{lipsum}
% FIGURES, TIKZ AND BOXES
\RequirePackage{graphicx}
\RequirePackage{float}
\RequirePackage{xcolor}
\RequirePackage{tikz}
\RequirePackage{tikz-3dplot}
\RequirePackage{pgfplots}
\RequirePackage[most]{tcolorbox}
% PAGE AND TEXT STYLES
\RequirePackage[colorlinks = true,
urlcolor = LinkColor,
anchorcolor = LinkColor,
citecolor = LinkColor,
filecolor = LinkColor,
linkcolor = LinkColor,
menucolor = LinkColor,
linktocpage = true,
bookmarks = true,
pdfusetitle]{hyperref}
\RequirePackage[top = 2.5cm,
bottom = 3.8cm,
left = 2cm,
right = 2cm,
marginparwidth = 1.25cm % <- added
]{geometry}
\RequirePackage{microtype}
\RequirePackage{titletoc}
\RequirePackage{multicol}
\RequirePackage{lmodern}
\RequirePackage{nameref}
\usetikzlibrary{%
decorations.pathreplacing,
decorations.pathmorphing,
decorations.markings,
shapes.multipart,
shapes.geometric,
arrows.meta,
tikzmark,
fadings,
arrows,
angles,
quotes,
calc,
3d,
}
\pgfplotsset{compat=1.18}
% COLOR SETTINGS
%%%%%%%%%%%%%%%%%%%%
\definecolor{myblack}{HTML}{101010} % PERSONAL BLACK
\definecolor{myorangeI}{HTML}{e93820} % PERSONAL ORANGE I
\definecolor{LinkColor}{HTML}{eb5a00} % PERSONAL ORANGE II
% CHAPTER SETTINGS
%%%%%%%%%%%%%%%%%%%%
% Avoid new page at the beginning of a new chapter
\makeatletter
\patchcmd{\chapter}{%
\if@openright
\cleardoublepage
\else
\clearpage
\fi
}{%
}{}{}
\makeatother
% formatting of the chapter title (number+text)
\titleformat{\chapter}% sectionning type to customize
[display]% shape, here number and title text on separate lines
{\normalfont\bfseries\color{myblack}\startcontents[sections]}%format; begins a partial toc named "sections" at each new chapter
{\chapterNumberAndMinitoc}% formatting code of the section (here chapter) number. Instead only number, this code also displays a partial TOC (sections in the current chapter)
{1em}% in "display" shape, the distance between the "number" and the "title", here he distance between the minitoc block and the rule above the chapter title
{\titlerule[2.5pt]\vspace{3pt}\titlerule\vspace{4pt}\LARGE\fontfamily{cmr}\textsc}% code before the title text. Here for rules and the title format. Added \fontfamily{cmr} for the bold small caps
% Setting of the space before and after the title
\titlespacing{\chapter}% Place the chapter block almost at top of the page
{0pt}% space added at left
{20pt}% vertical space added before
{20pt}% vertical space added after (space between chapter title and section title, for example)
\titleclass{\chapter}{straight} % so, if the chapter is at the beginning of a page, there is no vertical space before
% Further geometry settings
\columnsep=20pt % gap between the two columns in the multicols environment
\newlength{\minitocInnerSep}% inner sep in the minitoc node
\setlength{\minitocInnerSep}{10pt}
\newlength{\minitocWidth}% width of the minitoc block
\setlength{\minitocWidth}{0.8\textwidth}
\newlength{\chapterBlockWidth}% width of the block with the chapter number
\setlength{\chapterBlockWidth}{0.15\textwidth} % this value must be less than (1-0.8)\textwidth; here with 1-0.8-0.15=0.05, we have 0.05 for the width of the region of the rotated text. Never be less than 0.03.
\newlength{\minipageWidth}% width of the minipage in the minitoc
\setlength{\minipageWidth}{\dimexpr\minitocWidth-2\minitocInnerSep}%So the width of the minitoc block remains \minitocWidth
% formatting the section type (named p-section, see the prefix in \printcontents[sections] below) in the partial toc
\titlecontents{p-section}%
[0pt]% left margin, i.e. space before the text, generally for the section number
{}% code before (global formatting code).
{}% section number formatting code
{}% formatting code for sections without number
{\titlerule*[6pt]{.}\contentspage}% filler (here, dotted line) formatting. Followed by the page number (aka \contentspage)
\newcommand{\chapterNumberAndMinitoc}{%
\begin{tikzpicture}
% minitoc node
\node[%
minimum height = 3.2 cm,% Minimum height of the box
inner sep = \minitocInnerSep,% The border thickness
fill = myblack,% Color background
outer sep = 0pt %Needed to avoid overfull hbox
] (minitoc) {%
\color{white}
\begin{minipage}{\minipageWidth}
\begin{multicols}{2}
%displays the partial toc
\printcontents[sections]%
{p-}% prefix; so we can adjust the layout of the partial toc without changing the main (here name = p-section for modifying the sections in this partial toc)
{1}% display the partial toc from level 1 (0=chapter, 1=section)
[1]% ... to the level 1 (section)
{}% code for the partial toc
\end{multicols}
\end{minipage}
};
%Draw of the chapter block
\coordinate (chapterBlockNE) at ($(minitoc.north west)+(\textwidth,0)$);
\coordinate (chapterBlockSW) at ($(minitoc.south west)+(\textwidth-\chapterBlockWidth,0)$);
\fill[myblack] (chapterBlockNE) rectangle (chapterBlockSW);
%Display the chapter number
\node[%
anchor = center,
font = \color{white}\fontsize{80}{90}\selectfont %
] at ($(chapterBlockNE)!0.5!(chapterBlockSW)$) {\thechapter};
%Display the rotated text
\coordinate (rotatedTextC) at ($(minitoc.north east)!0.5!(chapterBlockSW)$);% center of the rotated text
\node[%
rotate = 90,
anchor = center,
font = \color{black}\Large\normalfont
] at (rotatedTextC) {\textls[180]{\textsc{List} N\textsuperscript{o}}};
\end{tikzpicture}%
}
файл test.tex
:
\documentclass[showframe]{solutionclass}
\pagestyle{plain}
\begin{document}
\tableofcontents
\chapter{Entering the commands}
\section{Unbreakable Form}
\subsection{Subsection}
\section{Breakable Form}
\lipsum[1-70]
\section{Using the references}
\section{Equations style}
\lipsum[1-40]
\section{Additional Boxes}
\lipsum[1-34]
\section{Additional Commands}
\section{Equations style}
\section{Additional Boxes}
\lipsum[1-7]
\section{Additional Commands}
\section{Additional Boxes}
\section{Additional Commands}
\lipsum[1-6]
\chapter{New Chapter}
\section{New Section}
text
\newpage
\chapter{Another New Chapter}
\section{A New Section}
\end{document}
Несколько снимков экрана выходных данных (с использованием showframe
опции класса документа, предоставленнойгеометрияупаковка):