评论

评论

我有一个详细清单:

\begin{itemize}
    \item Lorem
    \item Ipsum
    \item Sit
    \item Dolor
    \item Amet
\end{itemize}

我想在“Lorem”和“Ipsum”的右侧创建一个表彰,并在表彰处添加一些文字。此文字的级别应在第一行和第二行之间。我该如何完成此操作?

例子

答案1

需要更多的通用性。OP 的示例效果很好,因为“Lorem”和“Ipsum”的宽度大致相同。但如果 Ipsum 行更长,则输出如下:

原始输出

借鉴大括号括住项目中的多个项目,括号内为文本,我们可以这样写:

\documentclass{article}
\pagestyle{empty}% for cropping
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calc}
\newcommand{\ntikzmark}[2]{#2\thinspace\tikz[overlay,remember picture,baseline=(#1.base)]{\node[inner sep=0pt] (#1) {};}}

\newcommand{\makebrace}[3]{%
    \begin{tikzpicture}[overlay, remember picture]
        \draw [decoration={brace,amplitude=0.5em},decorate]
        let \p1=(#1), \p2=(#2) in
        ({max(\x1,\x2)}, {\y1+0.8em}) -- node[right=0.6em] {#3} ({max(\x1,\x2)}, {\y2});
    \end{tikzpicture}
}

\begin{document}

\begin{itemize}
    \item \ntikzmark{L}{Very Long Lorem}
    \item \ntikzmark{O}{Long Ipsum}
    \item \ntikzmark{X}{Sit}
    \item \ntikzmark{Y}{Dolor}
    \item Amet
\end{itemize}
\makebrace{L}{O}{Bla bla bla.}
\makebrace{X}{Y}{More bla bla bla.}

\end{document}

得出的结果是:

修正输出

将 'Lorem' 改为 'Very Long Lorem' 则结果为:

替代校正输出

我突然想到你可能要用多个括号。我修改了代码以适应这种可能性。在这种情况下,输出如下所示:

备用输出

诀窍是找到最长的线,并以此为基础绘制支架。也许有更简单的方法,我很想看看……

#

尽管可能显得乏味,我还是稍微简化了界面并提供了格式化选项。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calc}

\newcounter{itemnum}

\newcommand{\nt}[2][0pt]{%
    \stepcounter{itemnum}%
    \if###2##%
    \else
        #2%
        \thinspace
    \fi
    \tikz[overlay,remember picture,baseline=(\theitemnum.base),xshift=#1]\node (\theitemnum){};%
}

\newcommand{\makebrace}[4][0pt]{%
    \begin{tikzpicture}[overlay, remember picture]
        \draw [decoration={brace,amplitude=0.5em},decorate]
        let \p1=(#2), \p2=(#3) in
        ({max(\x1+#1,\x2+#1)}, {\y1+1.75ex}) -- 
            node[right=0.6em] {#4} ({max(\x1+#1,\x2+#1)}, {\y2-0.5ex});
    \end{tikzpicture}%
}

\newenvironment{braceitems}{%
    \begin{enumerate}
}{%
    \end{enumerate}
    \setcounter{itemnum}{0}%
}

\begin{document}

\begin{braceitems}
    \item \nt{Very Long Lorem}
    \item \nt{Long Ipsum}
    \item \nt{Sit}
    \item \nt{Dolor}
    \item \nt{Amet}
\end{braceitems}
\makebrace{1}{2}{Bla bla bla.}
\makebrace{2}{5}{More bla bla bla.}
\makebrace{4}{5}{A note.}

\end{document}

得出的结果为:

新输出

这并不是我们想要的。因此我们使用可选参数来移动括号,\makebrace[15pt]{2}{5}{More bla bla bla.}得到如下结果:

更好的新产出

解释:新的计数器itemnum会跟踪列表中的项目。使用 中的项目编号\makebrace来确定如何绘制括号。 的可选参数\makebrace将移动括号。

碰巧的是,这为食谱格式问题提供了一个有趣的解决方案,这就是为什么我似乎专注于该解决方案。


我稍微修改了代码。我发现,例如,这\item \nt{Very Long Lorem\\and more}会产生这样的结果:

两行 \item 错误输出

同样,这可能不是我想要的。我更改了代码以\nt允许使用空参数,这只会为括号的绘制创建一个锚点:\item Very Long Lorem\nt{}\\and more,从而产生以下内容:

两行 \item 输出效果更佳

答案2

评论

使用万能的 TikZ 及其decorations.pathreplacing库来放置brace装饰。

执行

\documentclass{article}
\pagestyle{empty}% for cropping
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\newcommand{\tikzmark}[2]{\tikz[remember picture,baseline=(#1.base)]{\node[inner sep=0pt] (#1) {#2};}}
\begin{document}
\begin{itemize}
    \item \tikzmark{L}{Lorem}
    \item \tikzmark{I}{Ipsum}
    \item Sit
    \item Dolor
    \item Amet
\end{itemize}
\begin{tikzpicture}[remember picture,overlay]
    \draw[decorate,decoration={brace}] (L.north east) -- node[right] {Bla bla bla} (L.north east |- I.south east);
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

相关内容