文本侧面、章节标题下方的图标

文本侧面、章节标题下方的图标

我目前正在尝试编写一个自定义命令,帮助我在节文本的侧面(节标题的正下方)显示一堆图标。图标数量总是相同(在我的情况下是 5 个),但基本上会有一个开关每个图标的选项。根据选项的不同,图标的外观会略有不同,并会显示在另一列中。每种选项类型(开/关)应该有一列。图标大小约为 24x24 像素。

为了说明我想要实现的目标,这里有一张图片: 部分标题下方的自定义图标

说实话,我尝试了很多方法(\makebox,等等),但我无法在不破坏其余布局的情况下获得我想要的结果(例如,确实\makebox导致文本不再缩进)。我还找到了一种基于参数切换内容的方法,\numif例如,但我不确定是否可以同时进行内容切换和更改对齐方式。

所以我的问题是,是否有人可以给我一些建议,我应该朝哪个方向去尝试,以及用一个命令完成所有事情是否真的可行 (也是可行的)?例如,如果我必须对每个图标使用一个命令,这对我来说没有问题。


编辑:

为了更好地说明我的问题,我创建了一个 MWE:

\documentclass[11pt,fleqn,openany]{book}

\usepackage[top=3cm,bottom=3cm,left=2.5cm,right=2.5cm]{geometry}

\usepackage{lipsum}
\usepackage{mwe}

\usepackage[table,xcdraw]{xcolor}
\definecolor{colcustom}{RGB}{13,211,155}

% styling of section numbering
\makeatletter
\renewcommand{\@seccntformat}[1]{\llap{\textcolor{colcustom}{\csname the#1\endcsname}\hspace{1em}}}                    
\renewcommand{\section}{\@startsection{section}{1}{\z@}
    {-4ex \@plus -1ex \@minus -.4ex}
    {1ex \@plus.2ex }
    {\normalfont\large\sffamily\bfseries}}
\renewcommand{\subsection}{\@startsection {subsection}{2}{\z@}
    {-3ex \@plus -0.1ex \@minus -.4ex}
    {0.5ex \@plus.2ex }
    {\normalfont\sffamily\bfseries}}

% styling of icons on the side of text
\newcommand{\includedinpackages}{\makebox[-1.5cm]{\includegraphics[width=20px]{example-image-a}}}

\begin{document}

\chapter{Main Chapter}

\section{First Section}
\includedinpackages
\lipsum[3-4]

\subsection{First Subsection}
\lipsum[1]

\end{document}

当使用\makebox[-1.5cm]{\includegraphics[width=20px]{example-image-a}}在章节编号下方添加图像时,章节文本不再缩进,而是从图像附近的某个位置开始。我尝试通过在\hspace文本前添加来修复它,但它看起来很丑陋,而且很难正确对齐文本。

有人可以提示我我做错了什么吗?

我还在互联网上找到了有关语法的信息\makebox,据说您可以使用它来相应地\makebox(x,y){content}定位框xy方向。但我只能开始\makebox[x]{content}工作。我缺少特殊的包/选项还是这是错误的信息?

答案1

因此,这是一个开始:

在此处输入图片描述

\documentclass[11pt,fleqn,openany]{book}

\usepackage[top=3cm,bottom=3cm,left=2.5cm,right=2.5cm]{geometry}

\usepackage{lipsum}
\usepackage{mwe}

\usepackage[table,xcdraw]{xcolor}
\definecolor{colcustom}{RGB}{13,211,155}

\newsavebox\iconbox
\savebox\iconbox{}
\newcommand{\seticons}[1]{%
  \savebox\iconbox{{\makebox[\iconboxwidth]{\includegraphics[width=\iconboxwidth]{#1}}}}}
\newlength{\iconboxwidth}
\setlength{\iconboxwidth}{0.5in}
\newlength{\iconsep}
\setlength{\iconsep}{4pt}
\makeatletter
\renewcommand{\@seccntformat}[1]{%
  \llap{\parbox[t][0pt]{\iconboxwidth}{\hfill\textcolor{colcustom}{\csname the#1\endcsname}\\[\iconsep]\usebox{\iconbox}}\hspace{0.5em}}}
\renewcommand{\section}{\@startsection{section}{1}{\z@}
    {-4ex \@plus -1ex \@minus -.4ex}
    {1ex \@plus.2ex }
    {\normalfont\large\sffamily\bfseries}}
\renewcommand{\subsection}{\@startsection {subsection}{2}{\z@}
    {-3ex \@plus -0.1ex \@minus -.4ex}
    {0.5ex \@plus.2ex }
    {\normalfont\sffamily\bfseries}}

\begin{document}

\chapter{Main Chapter}

\seticons{example-image-a}

\section{First Section}
\lipsum[3-4]

\setlength{\iconboxwidth}{0.75in}
\seticons{example-image-b}

\subsection{First Subsection}
\lipsum[1]

\end{document}

基本上,我们提供这个用户界面:

  • \seticons{<image-file>}设置将要打印的下一个图标图像。
  • \setlength{\iconwidth}{<length>}设置图像的宽度
  • \setlength{\iconsep}{<length>}设置图标和部分编号之间的间隔

如果你想改变尺寸,你需要这样做命令\seticons。我宁愿假设你无论如何都不需要这样做,但你也可能有能力这样做。

这假设图标的相关图像是单个单独的图像文件。更复杂的方法是允许您识别要包含在两列中的单个图标文件,但我还没有尝试过。

您可能需要取消设置图标。在这种情况下,您可能需要另一个命令:

  • \newcommand{\noicons}{\savebox{\iconbox}{}}

这里的技巧是将 icobox 放入 中\@seccntformat,它会打印出节号。基本上,我们会在 parbox 中打印数字(如您所见),然后打印换行符和空格。我们“欺骗” LaTeX 认为该框的高度为零,以确保以下文本没有间隙。如果您不想将它们设置在边距中(但我从您的示例中了解到您这样做了),那么技巧会有所不同且更简单,我们不需要 或 将\llap框设置为零高度。

编辑后补充:如果部分标题出现在页面底部附近,零高度技巧可能会引起问题,因为可能没有足够的空间。我想这是其中一种情况,如果发生这种情况,您可能需要手动干预。

更新

您问如何自动构建图标列。这里有一个想法。我假设两件事:您想要两列图标。您将决定将哪个图标放在哪一列。每列不超过 5 个图标。代码可以很容易地更改以适应不同的要求:这更多的是为了给您一个想法。

我首先必须添加两个包,这实际上只是懒惰,并且还有很多替代方法。

\usepackage{etoolbox}% for easy looping and boolean tests
\usepackage{listofitems}% for easy access to list items

然后我们定义一个新的长度,该长度仅内部使用

\newlength{\iconcolwidth}

然后我们定义一个命令来输出一个图标。这是为了让我们安全地包含一些空白。我认为当我最终完成代码时它是多余的,但它没有坏处。

\newcommand{\outputicon}[2][]{%
  \ifblank{#2}
  {}
  {\includegraphics[#1]{#2}}}

关键命令

\newcommand{\iconarrangement}[2]{%
  \begingroup
  \setsepchar{,}%
  \readlist*\licons{#1}%left hand
  \readlist*\ricons{#2}%right hand
  \setlength{\tabcolsep}{2pt}%
  \setlength{\iconcolwidth}{\dimexpr \numexpr (\iconboxwidth - \tabcolsep) / 2\relax sp \relax}%
  \renewcommand{\arraystretch}{1}%
  \renewcommand*{\do}[1]{%
    \ifboolexpr{%
      test {\ifnumcomp{\liconslen}{<}{##1}}
      and test {\ifnumcomp{\riconslen}{<}{##1}}}% PRINT NEITHER
    {}%
    {\ifnumless{\liconslen}{##1}
      {&}%
      {\outputicon[width=\iconcolwidth]{\licons[##1]}&}%
    \ifnumless{\riconslen}{##1}
      {\\}%
      {\outputicon[width=\iconcolwidth]{\ricons[##1]}\\}}}%
  \begin{tabular}{@{}cc@{}}
    \docsvlist{1,2,3,4,5}%
  \end{tabular}%
  \endgroup}

因此,我们给出了\iconarrangement两个以逗号分隔的图像文件列表。第一个是左侧列表,第二个是右侧列表。它遍历 lizt 并将它们放在表格中。我认为代码基本上是不言自明的。

最后,如果我们想将其用于我们的图标,我们会重新定义\seticons使用它。

\renewcommand\seticons[2]{%
  \savebox{\iconbox}{\iconarrangement{#1}{#2}}}

现在

\seticons{example-image-a, example-image-a}{example-image-b,example-image-b,example-image-b}

\section{New section}

\lipsum[1]

\seticons{example-image-b}{example-image-a, example-image-a}

\section{New section}

\lipsum[1]

生产

经过修改的版本

可能需要调整一些细节才能正确理解,但它提供了一个总体思路。

相关内容