如何将符号与列表关联

如何将符号与列表关联

我想将一个符号与一个\itemize环境关联起来,这样当我使用\ref它时就可以打印该符号。我还想将所选的符号打印在\itemize环境的中间。它看起来有点像环境\tag中的符号\equation,但我尝试时出现编译错误...

\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[francais]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{enumitem}
\usepackage{hyperref, nameref, cleveref}

\begin{document}

\begin{itemize} \tag{$\dagger$} \label{épée}

\item blalabla
\item blablabla
\item blablabla
\end{itemize}

blablabla cf \cref{épée}
\end{document}

答案1

继 Werner 的精彩回答之后如何引用方程的一部分?,我可以让它与 一起工作hyperref,但不能与 一起工作cref。也许知道 的人cref可以适应(这里,我只是\let \cref\ref

新的环境是myitemize,它接受一个可选参数,其中可以使用 指定标签\ilabel。当然,您必须提前定义与您的环境相关的所有符号,正如您将在我的序言中看到的那样。

\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[francais]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{enumitem}
\usepackage{hyperref}
\usepackage{nameref}
%\usepackage{cleveref}
\let\cref\ref
\usepackage[nopar]{lipsum}
\makeatletter
\expandafter\def\csname mysym1\endcsname{\dag}
\expandafter\def\csname mysym2\endcsname{\ddag}
\expandafter\def\csname mysym3\endcsname{*}
\expandafter\def\csname mysym4\endcsname{\&}    
\newcounter{itnum}
\newenvironment{myitemize}[1][]%
  {\relax\par\stepcounter{itnum}#1\hfil[\csname mysym\theitnum\endcsname]\hfil\itemize}%
  {\enditemize\ignorespaces}
\AtBeginDocument{\let\i@label\label}% https://tex.stackexchange.com/q/9939/5764
\newcommand{\ilabel}[1]{\def\@currentlabel{\csname mysym\theitnum\endcsname}\i@label{#1}}
\makeatother
\begin{document}
\lipsum[4]

\begin{myitemize}[\ilabel{épée}]
\item blalabla
\item blablabla
\item blablabla
\end{myitemize}
\lipsum[4]
blablabla cf \cref{épée}
\begin{myitemize}[\ilabel{ref2}]
\item blalabla
\item blablabla
\item blablabla
\end{myitemize}
\lipsum[4]
blablabla cf \cref{ref2}
\end{document}

在此处输入图片描述


为了帮助新手用户更多地了解所做的事情,我扩展了解释。

\makeatletter...\makeatother- 看\makeatletter 和 \makeatother 起什么作用?。基本上,@是用户代码中的受限字符,但可以使用这两个命令启用/禁用它在宏名称中的使用。由于许多 TeX 核心和软件包在@其宏名称中使用此字符,因此必须启用它才能允许修改这些例程。

\expandafter\def\csname mysym1\endcsname- 使用 时,宏名称中不允许使用数字\def,因此\def\mysym1{\dag}无法工作,但这正是我想要实现的。名称\csname mysym1\endcsname实际上相当于\mysym1语法。但是,说\def\csname...会重新定义\csname,我不想这样做,所以\expandafter说“跳过下一个东西(在本例中\def)并扩展后面的内容,即\csname。它实际上相当于不允许的\def\mysym1{},但遵循规则。

\newcounter{itnum}和- 创建(清零)并增加称为“计数器”的 LaTeX 结构,它只是一个整数索引。可以通过将 放在计数器名称前面\stepcounter{itnum}来访问当前值(作为文本字符串) ,在本例中为。\the\theitnum

\par- 开始新的段落

\relax- 什么也不做,但它不会“扩展”,因此尝试扩展导致它的代码的某些东西在到达时将停止扩展\relax。我把它放在这里,这样后面的任何内容都不会意外地被当作可选参数的一部分。

\hfil是可拉伸胶水(\hfill是 的弹性版本\hfil)。它可以在左右两侧的物品之间拉伸其水平长度。可以把它想象成橡皮筋。

\@currentlabel\i@label是 LaTeX 内部引用标签的方式,以及它如何创建新标签。我必须修改这些命令中的第一个,才能使此方法有效。然后我必须调用其中的第二个,将“新”标签定义传递给它。

\AtBeginDocument{}- 说“在 之前不要这样做\begin{document}。这样做的原因是它hyperref正忙于重新定义各处的东西,所以我不想这样做,直到hyperref完全完成它想要做的初始化。

\ilabel- 由于用户无法@正常在其代码中使用字符,因此我创建了这个宏,以便\i@label使用正确重新定义的标签有效地调用。

相关内容