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