\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@label
LaTeX가 내부적으로 레이블을 참조하는 방식과 새 레이블을 생성하는 방법입니다 . 이 방법이 작동하도록 수정해야 하는 명령 중 첫 번째 명령입니다. 그런 다음 두 번째 레이블 정의를 호출하여 "새" 레이블 정의를 전달해야 합니다.
\AtBeginDocument{}
- " 전까지는 하지 마세요 \begin{document}
. 그 이유는 hyperref
여기저기서 물건을 재정의하느라 바쁘기 때문입니다. 따라서 hyperref
원하는 초기화 작업이 완전히 완료될 때까지는 이 작업을 수행하고 싶지 않습니다.
\ilabel
- 사용자는 코드에서 문자를 정상적으로 사용할 수 없기 때문에 적절하게 재정의된 레이블을 사용하여 @
효과적으로 호출하기 위해 이 매크로를 만듭니다 .\i@label