我想使用enumitem
或类似的包来定义具有以下属性的基本列表:
- 当
\item
没有可选参数时,\rule{1em}{1em}
使用小方块 ( ) - 当
\item[foo]
被调用时,列表图标为\mymacro{foo}
我实际上会选择\item
默认不设任何参数,\mymacro{somedefaultvalue}
这样我就可以根据条件解决这个问题……
背景是我正在制作一个列表,其中的项目或多或少都是完整的,并且想要一些小饼图来表明各种事物的完成程度。我在 TikZ 中制作了饼图,但除了明确调用它们之外,我不知道如何将它们放在我想要的位置。(我正在写一篇论文大纲,其中指出哪些部分需要工作,哪些部分已经完成。或者更确切地说,我在玩 TikZ 来拖延时间……)
这是它目前的样子,但我必须\mymacro
在每个中明确调用\item
还有各种其他需要修复的小问题,比如将圆的中心与文本的中心线对齐等等......
答案1
\newenvironment{seamusitemize}
{\itemize\let\origitem\item
\renewcommand{\item}[1][default]
{\origitem[\csname seamus##1\endcsname]}}
{\enditemize}
\newcommand{\seamusdefault}{\textbullet}
\newcommand{\seamusx}{x}
\newcommand{\seamusy}{y}
\begin{document}
\begin{seamusitemize}
\item pippo
\item[x] pluto
\item[y] paperino
\end{seamusitemize}
\end{document}
这样,您就不需要知道\makelabel
在中是如何定义的itemize
;您可以使用 enumitem 来调整为标签保留空间的参数。
如果命令的定义\seamus...
不可行,可以改成\csname seamus##1\endcsname
。当其参数为时,定义执行默认操作\mymacro{##1}
很容易:\mymacro
default
\def\seamusdefault{default}
\newcommand{\mymacro}[1]{%
\def\next{#1}%
\ifx\next\seamusdefault
<default code>%
\else
<code using #1>%
\fi}
评论
正如 Danie Els 所观察到的,重新定义 有点危险\item
;没有列表环境或依赖于这些的其他环境,例如center
或flushleft
不能嵌套在 中seamusitemize
。更安全的策略是重新定义\makelabel
:
\newenvironment{seamusitemize}
{\itemize[label=default]
\let\origmakelabel\makelabel
\renewcommand{\makelabel}[1]{\origmakelabel{\mymacro{##1}}}}
{\enditemize}
然后\mymacro
可以按照上面的说明进行操作了。这需要加载枚举项(感谢 Seamus 的指出)。
答案2
标签itemize
使用宏进行类型化\makelabel
,该宏接收可选参数\item
作为强制参数。默认参数是,根据级别\@itemlabel
定义为等。\labelitemi
\labelitemii
您可以简单地定义一个自己的itemize
环境并相应地设置这些宏。
\documentclass{article}
\usepackage{tikz}
\makeatletter
\newcommand{\mydefaultlabel}{%
\@gobble{mydefaultlabel}% unique definition
}
\newcommand{\mymakelabel}[1]{%
\begingroup
\def\@tempa{#1}%
\def\@tempb{\@itemlabel}%
\ifx\@tempa\@tempb
\endgroup
\hss \llap{\textcolor{blue}{\rule{1em}{1em}}}%
\else
\endgroup
\hss \llap{%
\begin{tikzpicture}[xscale=-1,rotate=90]
\path (0,0) circle (.5em);
\fill [blue] (0,0) -- +(0:.5em)
arc [start angle=0, delta angle={(#1)*3.6}, radius=.5em] -- cycle; %
\end{tikzpicture}%
}%
\fi
}
\newenvironment{myitemize}{%
\itemize
\let\makelabel\mymakelabel
\let\@itemlabel\mydefaultlabel
}{%
\enditemize
}
\makeatother
\begin{document}
\begin{myitemize}
\item test
\item[10] a
\item[80] b
\item[50] c
\item[100] c
\end{myitemize}
\end{document}
答案3
我会尽量保持简单,不重新定义任何东西,并创建一个特殊的项目命令。不幸的是,我不懂 TikZ,因此使用了一个部分填充的框来说明这个概念。
\documentclass{article}
\usepackage{enumitem}
\newcommand\mybullet[1]{{%
\fboxsep=0pt
\fbox{\rule{0pt}{1em}%
\rule{1em}{#1em}}}}
\usepackage{ifmtarg}
\makeatletter
\newcommand\bitem[1][]{%
\@ifmtarg{#1}{\item[$\bullet$]}%--> or anything else e,g. \mybullet{0}
{\item[\mybullet{#1}]}}
\makeatother
\begin{document}
\begin{itemize}[]
\bitem aaaa
\bitem[0.25] bbbb
\bitem[0.00] ccc
\bitem[1.00] yyyy
\end{itemize}
\end{document}
这将得到类似下面的结果