Gostaria de associar um símbolo a um \itemize
ambiente para que quando eu \ref
o utilizar imprima o símbolo. Gostaria também que o símbolo escolhido fosse impresso no meio do \itemize
ambiente. Parece um pouco \tag
no \equation
ambiente, mas recebo um erro de compilação quando tentei ...
\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}
Responder1
Seguindo a bela resposta de Werner emComo alguém pode se referir a uma parte de uma equação?, posso fazer funcionar com hyperref
, mas não com cref
. Talvez alguém que conheça o assunto cref
possa se adaptar (aqui, eu só \let
\cref
quero \ref
).
O novo ambiente é myitemize
e leva um argumento opcional, no qual o rótulo pode ser especificado com \ilabel
. Claro, você deve definir antecipadamente todos os símbolos associados ao seu ambiente, como verá no meu 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 ajudar o usuário iniciante a aprender um pouco mais sobre o que é feito, estou ampliando a explicação.
\makeatletter...\makeatother
- VerO que \makeatletter e \makeatother fazem?. Basicamente, @
é um caractere restrito no código do usuário, mas seu uso em nomes de macros pode ser habilitado/desabilitado com estes dois comandos. Como grande parte do núcleo e dos pacotes do TeX usam esse @
caractere em seus nomes de macro, a habilitação deve ser feita para permitir modificações nessas rotinas.
\expandafter\def\csname mysym1\endcsname
- números não são permitidos em nomes de macro ao usar \def
, então \def\mysym1{\dag}
não vai funcionar, mas é isso que eu quero alcançar. O nome \csname mysym1\endcsname
é efetivamente equivalente a uma \mysym1
sintaxe. No entanto, say \def\csname...
redefiniria \csname
, o que não quero fazer, e então \expandafter
diz "pular a próxima coisa (neste caso \def
) e expandir o que se segue, a saber \csname
. É efetivamente equivalente ao disallowed \def\mysym1{}
, mas segue as regras.
\newcounter{itnum}
e \stepcounter{itnum}
- cria (zeros) e incrementa uma estrutura LaTeX chamada "contador", que é apenas um índice inteiro. O valor atual pode ser acessado (como uma string de texto) colocando-o \the
antes do nome do contador, neste caso \theitnum
.
\par
- iniciar um novo parágrafo
\relax
- não faça nada, mas ele não "se expande" e, portanto, algo que tenta expandir o código que leva a ele irá parar de se expandir quando chegar a \relax
. Coloquei-o aqui, para que nada do que se seguiu pudesse acidentalmente ser tomado como parte do argumento opcional.
\hfil
é cola extensível ( \hfill
é uma versão mais elástica de \hfil
). Ele pode esticar seu comprimento horizontal entre os itens à esquerda e à direita. Pense nisso como um elástico.
\@currentlabel
e \i@label
são a forma como o LaTeX se refere internamente a um rótulo e como ele cria um novo. É o primeiro desses comandos que devo modificar para que esse método funcione. Então devo recorrer ao segundo deles, passando-lhe a "nova" definição de rótulo.
\AtBeginDocument{}
- Diz "não faça isso até \begin{document}
. A razão para isso é que hyperref
estou ocupado redefinindo coisas em todos os lugares e, portanto, não quero fazer isso até que hyperref
esteja totalmente concluído, fazendo as inicializações que deseja fazer.
\ilabel
- Como um usuário não pode usar @
caracteres em seu código normalmente, eu crio esta macro para invocar efetivamente \i@label
com o rótulo redefinido corretamente.