我目前正在尝试编写一个自定义命令,帮助我在节文本的侧面(节标题的正下方)显示一堆图标。图标数量总是相同(在我的情况下是 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}
定位框x
和y
方向。但我只能开始\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]
生产
可能需要调整一些细节才能正确理解,但它提供了一个总体思路。