\DeclareTextSymbol と \DeclareTextCommandDefault は標準の \newcommand などとは対照的である

\DeclareTextSymbol と \DeclareTextCommandDefault は標準の \newcommand などとは対照的である

これ回答 egreg はマクロ を使用し\DeclareTextSymbol、を使用しました\DeclareTextCommandDefaultが、\UndeclareTextCommand私は以前 (失敗に終わったのですが) 単純な\newcommandまたは を試しました\let

これらのコマンドの正しい使用方法や標準との違い\newcommandなどについて詳しく教えていただけますか?

答え1

一部のコマンドは、現在の出力エンコーディングに基づいてアクションを選択できます。

最も単純な例はアクセントです。\"出力エンコーディング (使用可能なグリフとフォント内の位置の対応) が OT1 または T1 の場合に異なる動作をするようにしたいとします。

最初のケースでは、\"uアクセントと文字から出力が構成されますが、T1 では、事前に構成された文字が直接タイプセットされます (この違いは、ハイフネーションを考慮するときに非常に重要です)。

したがって、エンコーディングを切り替えるときに定義を変更するコマンドのリストを維持するのではなく、または同様の関数を使用してコマンドを定義できます\DeclareTextSymbol

を見てみましょう\textborn。これは基本 LaTeX では定義されていませんが、textcomp定義が提供されています。

% textcomp.sty, line 225
\DeclareTextCommandDefault{\textborn}{\tc@check@symbol2\textborn}

置換テキストが何をするのかを知ることは重要ではありませんが、これは\textborn次のように定義されます。

\?-cmd \textborn \?\textborn

(3 つのトークン、最後のトークンは単一のトークンであり、その展開は上記の置換テキストであり\tc@check@symbol2\textborn、 を実行することでアクセスできます\csname ?\string\textborn\endcsname)。

その後、ts1enc.defがロードされると、textcomp.sty暗黙的に が呼び出されるため\usepackage[TS1]{inputenc}、LaTeXは

\DeclareTextSymbol{\textborn}{TS1}{98}

これは前と同じようなトリックで、\textborn次のように定義します。

\TS1-cmd \textborn \TS1\textborn

(再び 3 つのトークン)。これが最も重要な部分です。このようなコマンドはどのように機能するのでしょうか?

の展開時に\textborn、LaTeX が文字がタイプセットされると予想される場所にある場合、現在の出力エンコーディングが TS1 に対してチェックされます。そうである場合は、現在のフォントのグリフ番号 98 だけが使用されます。そうでない場合は、グループが開かれ、エンコーディングが TS1 に切り替えられ、文字 98 がタイプセットされ、グループが閉じられます。

このようなコマンドは常に堅牢です。つまり、移動引数内で見つかった場合、書き込み操作が関係しているときに拡張されるのではなく、それ自体が生成されます。

これは、あなたが困惑する理由を説明するはずです

\let\oldtextborn\textborn

をロードする前に、とkpfontsによって生成された出力に違いがないことを確認します。パッケージは を再定義するのではなく、選択されたフォント ファミリ名に基づいて新しいフォントを TS1 エンコーディングに関連付けます。 したがって、と は同じままです。\textborn\oldtextbornkpfonts\textborn\oldtextborn\textborn

\textbornファミリーを使用する定義にはcmr注意が必要です。なぜなら、次のような戦略は

\let\oldtextborn\textborn
\renewcommand\textborn{{\fontfamily{cmr}\selectfont\oldtextborn}}

安全であるとは保証されません。たとえば、\textbornセクションのタイトルやキャプションなどの動的な議論に が出現した場合、.auxファイルには

\@writefile{toc}{\contentsline {section}{\numberline {1}{\fontfamily  {cmr}\selectfont  {\fontfamily  {cmr}\selectfont  \textborn }}}{1}}

コマンドが数回展開されているように見えます。他の状況では、これが無限ループにつながる可能性もあります。

関与する戦略の方が\UndeclareTextCommand間違いなく安全です。

関連情報