如何將符號與列表關聯

如何將符號與列表關聯

我想將符號與\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使用正確重新定義的標籤進行有效調用。

相關內容