Crie um estilo específico para capítulos usando o titlesec

Crie um estilo específico para capítulos usando o titlesec

Estou escrevendo um modelo para aprender um pouco mais sobre LaTeX e não estou satisfeito com meu \chapter{}comando. Tentei fazer um mini TOC com o número do capítulo como na figura abaixo: insira a descrição da imagem aqui

No entanto, quero algumas mudanças específicas para tornar este perfeito para mim.

  1. Primeiro, fico muito incomodado com os espaçamentos diferentes nos lados direito e esquerdo, e não sei como consertar isso, além disso, quero que o espaçamento em todos os lados seja igual, não como na imagem abaixo: insira a descrição da imagem aqui

  2. Em segundo lugar, eu realmente gostaria que o conteúdo dentro do mini índice se adaptasse ao tamanho do retângulo que o contém, de modo que quanto mais seções dentro dele, menor será a fonte para caber em todas as seções.

  3. Terceiro, recebo o aviso Overfull \hbox (1.22324pt too wide) in paragraph at lines 15--15quando digito o comando \chapter{Entering the commands}e realmente não tenho ideia do porquê.

Bem, meu MWE é este:

Meu .clsarquivo:

\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}              
}                                                 

Meu .texarquivo:

\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}

Comentários adicionais:

Retiro o número de cada seção para manter o mini-TOC limpo;

Caso esse código não funcione, é possível que eu tenha esquecido alguma informação no post, pois como o .clsé muito grande, não quis colocar tudo para que não fosse difícil de entender, mas para mim este código funciona;

Estou compilando com pdfLaTeX.

Responder1

Resposta parcial

os diferentes espaçamentos nos lados direito e esquerdo,

\hbox muito cheio (1,22324pt muito largo)

Eu adicionei

\titlecontents{section}
[0em]
{}
{}
{}
{\titlerule*[1pc]{.}\contentspage}

Também adicionei inner sepe outer seppara calcular a largura disponível para o último nó com o xfppacote

\fpeval{\textwidth-2.5cm-20pt-5mm}pt
  • 2,5 cm de largura do primeiro nó
  • 20pt a altura (girar 90) do segundo nó
  • 5mm 2 x a separação interna do terceiro nó

Adicionada a % atrás da minipágina final

EDITAR

Eu realmente gostaria que o conteúdo dentro do mini índice se adaptasse ao tamanho do retângulo que o contém

Eu uso a fittingbiblioteca detcolorbox

\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}

insira a descrição da imagem aqui

Responder2

Aqui está minha solução.

No arquivo .cls, mantenho o xcolorpacote. Não é necessário comotikzfornecem acesso às cores, mas podemos usar a opção global como divpsnamesna classe do documento para acessar mais nomes de cores.

Eu adicionei marginparwidth = 1.25cmnas opções dogeometriapacote (então há uma pequena margem).

Guardei seu código para evitar nova página no início de um novo capítulo ( \patchcmd{\chapter}{...}).

Meu código usa o TikBiblioteca Z calc, mas você já a carregou em seu arquivo de classe, então não preciso adicioná-la. Mas lembre-se de não removê-lo.

No código que formata o título do capítulo (veja \titleformat), adicionei \fontfamily{cmr}para ter acesso a versalete em negrito.

Na configuração de \titlespacing, usei comprimentos fixos, mas você pode usar comprimentos friccionados.

Eu defini o títuloaula(atítulosecconceito) para straightmanter espaço vertical antes do bloco de capítulo, a menos que seja no topo de uma página. Com a showframeopção dogeometriapacote, você pode ver na terceira captura de tela que não há espaço vertical quando um capítulo começa no topo da página. Observe que se você não tiver optado por permitir que o capítulo comece no meio de uma página, definir o espaço vertical adicionado antes de 0ptin \titlespacingnão será suficiente. Ainda resta um pouco de espaço (vejahttps://github.com/jbezos/titlesec/issues/53), e como o autor do pacote não corrigirá esse "bug", pois é o mesmo comportamento no kernel do LaTeX, há uma solução alternativa aqui:O pacote titlesec adiciona espaço extra em cima de \chapter, apesar dos comandos em contrário.

Então, se você não quiser que o capítulo comece no meio da página, após remover o código \patchcmd{\chapter}{...}, você deve definir (in \titlespacing) oespaço vertical antespara 0ptE adicione este pequeno código:

\makeatletter % the macro name contains @
\patchcmd{\ttl@mkchap@i}{\vspace*{\@tempskipa}}{}{}{}
\makeatother

No resto do código, defini alguns comprimentos (80% do \textwidthpara ominitocbloco, 15% do valor \textwidthpara onúmero do capítulobloco, osetembro internodominitocbloco, a separação da coluna.

Se o número do capítulo ultrapassar 9, será necessário ajustar (reduzir) o tamanho do número exibido (no segundo \nodeno código do \chapterNumberAndMinitoccomando).

Em seguida, defino a formatação do Índice parcial.

Então, estamos chegando ao \chapterNumberAndMinitoccódigo.

Temos 4 etapas: exibir ominitocbloco à esquerda, exibindo o fundo do número do capítulo à direita, com a mesma altura dominitocbloco, exibe o número do capítulo no centro e, finalmente, exibe o texto girado no centro do espaço entre os dois blocos coloridos.

Eu removi seu código \renewcommand{\section}[1]{...}.

Observe que você usou uma cor muito escura (chamada myblack) para ominitocbloco, o título do capítulo, o número do capítulo, as regras do capítulo, mas não para o texto girado. Eu mantive o preto para o texto girado.

Para demonstrar o uso desta classe LaTeX em situação real, usei muitos textos falsos com olábiospacote (que você já carregou em seu arquivo de classe original). Você pode ajustar alguns espaços para o sumário parcial se precisar exibir números de páginas acima de 99 (veja em \titlecontents{p-section}e substitua {}por {\contentsmargin{20pt}}nocódigo antes, então você tem espaço para um terceiro dígito para o número da página).

O solutionclass.clsarquivo:

\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}%
}                                               

o test.texarquivo:

\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}

Algumas capturas de tela da saída (usando a showframeopção de classe de documento, fornecida pelogeometriapacote):

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

informação relacionada