如果这是一个愚蠢的问题,请原谅我,但我对此有点生疏。
我想将一个类似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}