マクロ引数に基づいてラベルを生成する

マクロ引数に基づいてラベルを生成する

私は以下の問題を解決できるほど LaTeX に精通していません。2 つのパラメータを受け取り、適切なボックスを作成し、最初の引数を太字にし、2 番目の引数を強調テキストにするマクロがあります。

\newcommand{\Step}[2]{%
\noindent{\\[0pt] \rule{0pt}{0.5ex}%
\hspace*{1em}\fbox{\parbox[t]{0.92\columnwidth}{{\bfseries Step #1.\ }\emph{#2}}}}
    \vspace*{1.1ex} }

私はこのマクロをテキスト内で 10 ~ 15 回呼び出します (それだけのステップがあります)。このマクロが展開されているページを参照できるように、ラベルを配置したいと思います。最後の行を次のように変更します。

    \vspace*{1.1ex} \label{step:mode:#1} }

エラーがポップアップし始めます。まったく関係のない行に次のエラーが表示されます。

! Missing \endcsname inserted.
<to be read again> 
               \protect 
l.160 ...aults Occur\relax }{figure.caption.52}{}}

この行はおそらく何らかの補助ファイルからのものです。

最初の引数を適切に展開し、ラベルの引数として使用するにはどうすればよいでしょうか? 最初の引数にはスペースが含まれておらず、今後も含まれることはありません。

答え1

\textsuperscriptラベルを設定するときに再定義することができます。ここでは\@firstofone適切な再定義を示します。このコマンドは単に引数を読み取ってそのまま使用します。

\csname phantomsection\endcsnameパッケージに機能するリンクを追加するのも良い考えかもしれませんhyperref:

\documentclass{article}
\usepackage{lipsum}% for demonstration only
\usepackage{hyperref}% to show, that this works

\makeatletter
\newcommand{\Step}[2]{%
  \par\noindent{\rule{0pt}{0.5ex}%
    \csname phantomsection\endcsname
    {\let\textsuperscript\@firstofone\label{#1}}%
    \hspace*{1em}\fbox{\parbox[t]{\dimexpr \linewidth-2em-2\fboxsep-2\fboxrule\relax}{%
        {\bfseries Step #1.\ }\emph{#2}}}}\par
  \vspace*{1.1ex} 
}
\makeatother

\begin{document}
\Step{R\textsuperscript{+}4.a}{blah, blah}
See R\textsuperscript{+}4.b on page \pageref{R+4.b}.
\lipsum

\Step{R\textsuperscript{+}4.b}{blah, blah}
See R\textsuperscript{+}4.a on page \pageref{R+4.a}.
\lipsum

\end{document}

が使用されない場合は、は\csname phantomsection\endcsname単に となり、ほとんど何の意味もありません。\relaxhyperref

答え2

私なら別の方法でやります:

\usepackage{calc}
\newcommand{\Step}[2]{%
  \par\addvspace{1.1ex}
\noindent\hspace*{1em}\fbox{\parbox[t]{\columnwidth-2em-2\fboxsep-2\fboxrule}
  {\textbf{Step #1.}\ \emph{#2}}}\label{step:mode:#1}\\*[1.1ex]}

この方法では、\fbox行の中央に配置され、行の前後のスペースが均等になります (現在のスペースが気に入らない場合は、修正してください)。

ラベルにはスペースを使用できますが、アクセント付き文字やコマンドは使用できません。そのため、\Step{R\textsuperscript{+}4.a}{blah, blah}必ず問題が発生します。次のようにすれば解決できます。

\newcommand{\Step}[3]{%
  \par\addvspace{1.1ex}
\noindent\hspace*{1em}\fbox{\parbox[t]{\columnwidth-2em-2\fboxsep-2\fboxrule}
  {\textbf{Step #2.}\ \emph{#3}}}\label{step:mode:#1}\\*[1.1ex]}

そしてこの問題のあるエントリーを

\Step[R+4.a]{R\textsuperscript{+}4.a}{blah, blah}

参照すると

\pageref{R+4.a}

関連情報