我想將符號與\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
繼維爾納的精彩回答後如何引用方程式的一部分?,我可以讓它與 一起工作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
。它實際上相當於 disallowed \def\mysym1{}
,但遵循規則。
\newcounter{itnum}
-\stepcounter{itnum}
創建(零)並遞增一個稱為“計數器”的 LaTeX 結構,它只是一個整數索引。透過放置\the
在計數器名稱之前(在本例中為 ),可以存取當前值(作為文字字串)\theitnum
。
\par
- 開始一個新段落
\relax
- 什麼都不做,但它不會“擴展”,因此嘗試擴展導致它的程式碼的東西將在到達 時停止擴展\relax
。我把它放在這裡,這樣後面的任何內容都不會意外地被視為可選參數的一部分。
\hfil
是可拉伸膠水(\hfill
是有彈性的版本\hfil
)。它可以在其左側和右側的項目之間拉伸其水平長度。把它想像成一條橡皮筋。
\@currentlabel
和\i@label
是 LaTeX 在內部引用標籤的方式,以及它如何創建新標籤的方式。我必須修改這些命令中的第一個命令才能使該方法起作用。然後我必須調用其中的第二個,並將“新”標籤定義傳遞給它。
\AtBeginDocument{}
- 說「在 之前不要這樣做\begin{document}
。這樣做的原因是忙於重新定義各處的東西,所以在完全完成它想做的初始化hyperref
之前我不想這樣做。hyperref
\ilabel
- 由於用戶無法@
正常在程式碼中使用字符,因此我創建此巨集以\i@label
使用正確重新定義的標籤進行有效調用。