Me gustaría asociar un símbolo a un \itemize
entorno para que cuando \ref
lo use imprima el símbolo. También me gustaría imprimir el símbolo elegido en el medio del \itemize
entorno. Parece algo así como \tag
en el \equation
entorno, pero aparece un error de compilación cuando lo probé...
\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}
Respuesta1
Siguiendo la excelente respuesta de Werner en¿Cómo se puede hacer referencia a una parte de una ecuación?, puedo hacer que funcione con hyperref
, pero no con cref
. Quizás alguien que conozca las entrañas de cref
pueda adaptarse (aquí, solo \let
\cref
lo hago \ref
).
El nuevo entorno es myitemize
y requiere un argumento opcional, en el que se puede especificar la etiqueta con \ilabel
. Por supuesto, debes definir todos los símbolos asociados con tu entorno de antemano, como verás en mi preámbulo.
\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}
Para ayudar al usuario novato a conocer un poco más de lo que se hace, amplié la explicación.
\makeatletter...\makeatother
- Ver¿Qué hacen \makeatletter y \makeatother?. Básicamente, @
es un carácter restringido en el código de usuario, pero su uso en nombres de macros se puede habilitar/deshabilitar con estos dos comandos. Dado que gran parte del núcleo y los paquetes de TeX utilizan este @
carácter en sus nombres de macro, se debe realizar la habilitación para permitir modificaciones a esas rutinas.
\expandafter\def\csname mysym1\endcsname
- Los números no están permitidos en los nombres de las macros cuando se usan \def
, por lo que \def\mysym1{\dag}
no funcionará, pero eso es lo que quiero lograr. El nombre \csname mysym1\endcsname
es efectivamente equivalente a una \mysym1
sintaxis. Sin embargo, decir \def\csname...
redefiniría \csname
, lo cual no quiero hacer, por lo que \expandafter
dice "omitir lo siguiente (en este caso \def
) y expandir lo que sigue, es decir \csname
, . Efectivamente es equivalente a no permitido \def\mysym1{}
, pero sigue las reglas.
\newcounter{itnum}
y \stepcounter{itnum}
- crea (ceros) e incrementa una estructura LaTeX llamada "contador", que es solo un índice entero. Se puede acceder al valor actual (como una cadena de texto) colocándolo \the
antes del nombre del contador, en este caso \theitnum
.
\par
- comenzar un nuevo párrafo
\relax
- no haga nada, pero no se "expande", por lo que algo que intente expandir el código que conduce a él dejará de expandirse cuando llegue a \relax
. Lo pongo aquí para que nada de lo que sigue pueda ser tomado accidentalmente como parte del argumento opcional.
\hfil
Es pegamento estirable ( \hfill
es una versión más elástica \hfil
). Puede estirar su longitud horizontal entre los elementos a su izquierda y derecha. Piense en ello como una banda elástica.
\@currentlabel
y \i@label
son la forma en que LaTeX se refiere internamente a una etiqueta y cómo crea una nueva. Es el primero de estos comandos que debo modificar para que este método funcione. Luego debo invocar el segundo de ellos, pasándole la definición de etiqueta "nueva".
\AtBeginDocument{}
- Dice "no hagas esto hasta" \begin{document}
. La razón de esto es que hyperref
estoy ocupado redefiniendo cosas por todas partes, por lo que no quiero hacer esto hasta que hyperref
haya terminado por completo con las inicializaciones que quiere hacer.
\ilabel
- Dado que un usuario no puede usar @
caracteres en su código normalmente, creo esta macro para invocarla de manera efectiva \i@label
con la etiqueta redefinida correctamente.