Как связать символ со списком

Как связать символ со списком

Я хотел бы связать символ с \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. Фактически это эквивалентно запрещенному \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с правильно переопределенной меткой.

Связанный контент