シンボルを環境に関連付けて、\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 は何をしますか?基本的に、 は@
ユーザー コード内では制限された文字ですが、マクロ名での使用は、これら 2 つのコマンドを使用して有効/無効にできます。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 が内部的にラベルを参照する方法と、新しいラベルを作成する方法です。このメソッドを機能させるには、これらのコマンドのうち最初のコマンドを変更する必要があります。次に、これらの 2 番目のコマンドを呼び出して、それに「新しい」ラベル定義を渡す必要があります。
\AtBeginDocument{}
- 「 まではこれを実行しないでください\begin{document}
。 」と表示されます。 はhyperref
あちこちで再定義に忙しいため、hyperref
が実行したい初期化が完全に完了するまでこれを実行したくないのです。
\ilabel
- 通常、ユーザーは@
コード内で文字を使用できないため、\i@label
適切に再定義されたラベルを効果的に呼び出すためにこのマクロを作成します。