定义一个新的 itemize 类环境,其中 \item[foo] 将 foo 传递给宏

定义一个新的 itemize 类环境,其中 \item[foo] 将 foo 传递给宏

我想使用enumitem或类似的包来定义具有以下属性的基本列表:

  1. \item没有可选参数时,\rule{1em}{1em}使用小方块 ( )
  2. \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}很容易:\mymacrodefault

\def\seamusdefault{default}
\newcommand{\mymacro}[1]{%
   \def\next{#1}%
   \ifx\next\seamusdefault
      <default code>%
   \else
      <code using #1>%
   \fi}

评论
正如 Danie Els 所观察到的,重新定义 有点危险\item;没有列表环境或依赖于这些的其他环境,例如centerflushleft不能嵌套在 中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}

这将得到类似下面的结果

在此处输入图片描述

相关内容