
でこれ回答 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
\oldtextborn
kpfonts
\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
間違いなく安全です。