将列表保存在可重复使用的框中

将列表保存在可重复使用的框中

如果这是一个愚蠢的问题,请原谅我,但我对此有点生疏。

我想将一个类似enumerate环境生成的列表存储在可重复使用的框中,以便在TikZ图片和其他地方重复使用。

可以这么说,fancybox.sty这是用一个实际的框架盒子而不是可重复使用的盒子来实现的。

天真地,我想做类似的事情:

\documentclass[a4paper,12pt]{article}
\begin{document}
\newsavebox{\enumbox}
\sbox{\enumbox}{%
\begin{enumerate}
    \item Title
    \item Abstract
    \item Keywords
    \item Outline
\end{enumerate}
}
{\centering\usebox{\enumbox}}
\end{document}

当然,上述代码不起作用,因为它既不是parbox也不是lrbox

有没有可以实现这个功能的软件包?否则,我该怎么做才能得到我想要的东西?

提前致谢。

答案1

您需要保存enumerate内容在一个\vbox

\setbox\enumbox\vbox{% …

但是,\centering由于enumerate的性质,框很\linewidth宽,因此 不起作用。
不使用 会\centering导致 ,overfull \hbox因为段落缩进会像往常一样插入。

解决方案 A

看来,在你的情况下,你可以简单地将宏定义为

\newcommand*{\enummacro}{\begin{enumerate} … \end{enumerate}}

并在 TikZ 节点内使用它。优点:节点不会很\linewidth宽,但只会像您指定的一样宽。

解决方案 B

您可以测量列表元素的宽度(假设它们都适合在一行宽度上)。

在这里,我选择了一个更简单的列表定义和处理解决方案,即

\newcommand*{\mylist}{Title,Abstract,Keywords,Outline}

\mylist宏仅包含逗号分隔的元素。

\getWidthOf需要\tikz@textfont和走私宏才能在里面使用tikzpicture(这里没有保证)。

解决方案 C

由于enumerate环境引入了垂直和水平空间,我不想处理,也因为下面的看起来更好,更容易维护,还有另一种解决方案,但很简单tabular

代码 A(enumerate猜测宽度)

\documentclass[a4paper,12pt]{article}
\usepackage{tikz}
\newcommand{\enummacro}{%
\begin{enumerate}
    \item Title
    \item Abstract
    \item Keywords
    \item Outline
\end{enumerate}}
\newsavebox\enumbox

\begin{document}
\setbox\enumbox\vbox{\enummacro}
\noindent\usebox\enumbox

\begin{tikzpicture}
    \node[draw, text width=8em, align=center] {\enummacro};
\end{tikzpicture}
\end{document}

输出(enumerate猜测的宽度)

在此处输入图片描述

溶液 B(经过适当测量enumerate

\documentclass[a4paper,12pt]{article}
\usepackage{tikz}

\newcommand*{\mylist}{Title,Abstract,Keywords,Outline}
\newlength{\widthOfWidestElement}

\makeatletter
\def\qrr@smuggle@length@through@interruptpgfpicture#1\endpgfinterruptpicture{%
    \edef\@tempa{\the#1}%
    \expandafter\endpgfinterruptpicture\expandafter#1\@tempa}
\newcommand*{\getWidthOf}[1]{%
    \pgfinterruptpicture
    \setlength{\widthOfWidestElement}{0pt}%
    \@for\@element:=#1\do{%
        \sbox0{\tikz@textfont\@element}%
        \ifdim\wd0>\widthOfWidestElement\widthOfWidestElement=\wd0\fi
    }%
    \qrr@smuggle@length@through@interruptpgfpicture\widthOfWidestElement
    \endpgfinterruptpicture
    \advance\widthOfWidestElement\itemindent
    \advance\widthOfWidestElement\leftmargin
    \advance\widthOfWidestElement\rightmargin
}
\newcommand*{\makeEnumerate}[1]{%
    \enumerate % maybe better output with
               % \parskip\z@
        \@for\@element:=#1\do{%
            \item \@element
        }
    \endenumerate
}
\makeatother
\begin{document}

\begin{tikzpicture}
    \getWidthOf{\mylist}
    \node[draw, text width=\widthOfWidestElement, align=center] {\makeEnumerate\mylist};
\end{tikzpicture}
\end{document}

输出 B(经过适当测量enumerate

在此处输入图片描述

代码 C ( tabular)

\documentclass[a4paper,12pt]{article}
\usepackage{tikz,array}

\newcommand*{\mylist}{Title,Abstract,Keywords,Outline}

\makeatletter
\newcommand*{\makeFakeEnumerate}[1]{%
    \begingroup
    \def\@temptabbody{}%
    \setcounter{enumi}{0}%
    \@for\@element:=#1\do{%
        \expandafter\g@addto@macro\expandafter\@temptabbody\expandafter{\expandafter&\@element \\}}%
    \tabular{>{\refstepcounter{enumi}\theenumi.}rl}
        \@temptabbody
    \endtabular
    \endgroup
}
\makeatother
\begin{document}
\begin{tikzpicture}
    \node[draw] {\makeFakeEnumerate\mylist};
\end{tikzpicture}
\end{document}

输出 C ( tabular)

在此处输入图片描述

答案2

除非有令人信服的理由使用盒子,否则更简单的做法是:

\documentclass[a4paper,12pt]{article}
\begin{document}
\newcommand\enumbox{%
\enumerate
    \item test
    \item Abstract
    \item Keywords
    \item Outline
\endenumerate
}
\enumbox
\end{document}

如果要居中,请执行以下操作:

\documentclass[a4paper,12pt]{article}
\usepackage{lipsum}
\begin{document}
\newcommand\enumbox{%
\enumerate
    \item test
    \item Abstract
    \item Keywords
    \item Outline
\endenumerate
}
\lipsum[1]\centering
\fbox{\hbox to 3cm{\vbox{\enumbox}}}
\end{document}

相关内容