我想将一个符号与一个\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
使用正确重新定义的标签有效地调用。