기호를 목록에 연결하는 방법

기호를 목록에 연결하는 방법

\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

Werner의 훌륭한 답변에 따라방정식의 일부를 어떻게 참조할 수 있나요?, 에서는 작동하게 할 수 있지만 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 구조를 생성(0)하고 증가시킵니다 . 현재 값은 \the카운터 이름(이 경우 ) 앞에 배치하여 텍스트 문자열로 액세스할 수 있습니다 \theitnum.

\par- 새 단락을 시작하세요

\relax- 아무것도 하지 않지만 "확장"되지 않으므로 코드를 확장하려고 시도하는 것이 에 도달하면 확장이 중지됩니다 \relax. 나는 그것을 여기에 넣었는데, 그 이후의 어떤 것도 우연히 선택적 인수의 일부로 받아들여지는 일이 없도록 하기 위함입니다.

\hfil신축성 있는 접착제입니다( \hfill의 신축성 있는 버전입니다 \hfil). 왼쪽과 오른쪽 항목 사이의 가로 길이를 늘릴 수 있습니다. 고무줄이라고 생각하시면 됩니다.

\@currentlabel\i@labelLaTeX가 내부적으로 레이블을 참조하는 방식과 새 레이블을 생성하는 방법입니다 . 이 방법이 작동하도록 수정해야 하는 명령 중 첫 번째 명령입니다. 그런 다음 두 번째 레이블 정의를 호출하여 "새" 레이블 정의를 전달해야 합니다.

\AtBeginDocument{}- " 전까지는 하지 마세요 \begin{document}. 그 이유는 hyperref여기저기서 물건을 재정의하느라 바쁘기 때문입니다. 따라서 hyperref원하는 초기화 작업이 완전히 완료될 때까지는 이 작업을 수행하고 싶지 않습니다.

\ilabel- 사용자는 코드에서 문자를 정상적으로 사용할 수 없기 때문에 적절하게 재정의된 레이블을 사용하여 @효과적으로 호출하기 위해 이 매크로를 만듭니다 .\i@label

관련 정보