マクロの比較が失敗する

マクロの比較が失敗する

私は LaTex 初心者ですが、同僚から問題を指摘されました。同僚は TeX ファイルでドキュメント タイプを定義しています (例: 'svvr'、'srs'、...)。この外部定義は、私のサンプル コード (MWE 2) の 4 行目と 5 行目に相当します。

ここで、この外部定義を TeX ファイルで使用して、どのドキュメント依存の処理を実行するかを決定する必要があります。これを行うために、選択をテストするための MWE を作成しました。

私のテスト コードはもともとインターネットから取得したもので、ジョブ名を特定の文字列 (例: "{\detokenize{svvr}") と比較します。\jobname との比較ができるように、TeX ファイルに "svvr.tex" という名前を付けました。

現在の問題は、\jobname (MWE 1) と比較すると、選択が正しく機能しないことです。

\documentclass{article}

% Own TeX file:
\begin{document}
    \edef\docTypeExt{\jobname}
    % Specify which document type is to be handled: 'svvr', 'srs', ...
    \edef\docTypeSvvr{\detokenize{svvr}} 
    \edef\docTypeSrs{\detokenize{srs}}

    \textbf{\jobname} 
    \textbf{\docShortcut}
    \textbf{\docTypeSvvr}
    \textbf{\docTypeSrs}
    \newline
    
    \ifx\docTypeExt\docTypeSvvr
        true
    \else
        false: \\
        \jobname \\
        \docShortcut \\
        \docTypeSvvr
    \fi
\newline

    \ifx\docTypeExt\docTypeSrs
        true
    \else
        false: \\
        \jobname \\
        \docShortcut \\
        \docTypeSrs
    \fi

\end{document}

しかし、同僚による外部定義 (MWE 2) と比較すると、比較は失敗します。

\documentclass{article}

% Given code, defined in included TeX file: 'svvr', 'srs', ...
\newcommand { \docpropPTdocShortcut } {svvr}    % Define document type here!
\gdef\docShortcut{\docpropPTdocShortcut}

% Own TeX file:
\begin{document}
    \edef\docTypeExt{\docShortcut}
    % Specify which document type is to be handled: 'svvr', 'srs', ...
    \edef\docTypeSvvr{\detokenize{svvr}} 
    \edef\docTypeSrs{\detokenize{srs}}

    \textbf{\jobname} 
    \textbf{\docShortcut}
    \textbf{\docTypeSvvr}
    \textbf{\docTypeSrs}
    \newline
    
    \ifx\docTypeExt\docTypeSvvr
        true
    \else
        false: \\
        \jobname \\
        \docShortcut \\
        \docTypeSvvr
    \fi
\newline

    \ifx\docTypeExt\docTypeSrs
        true
    \else
        false: \\
        \jobname \\
        \docShortcut \\
        \docTypeSrs
    \fi

\end{document}

外部定義でも機能するように選択をどのように構成する必要がありますか?

定義を変更しましたが、これまでの試みはすべて失敗しました。

答え1

によって配信されるすべての文字トークンは、\jobnameカテゴリ 12 (その他) です。例外: スペース (ASCII と Unicode の両方でコード ポイント番号 32) は、カテゴリ 10 (スペース) です。 によって配信される文字トークンも同様です\detokenize

ただし、2 番目の例で置換テキストに入る文字トークンは、または\docpropPTdocShortcutによって配信されるのではなく、TeX が .tex-input ファイルから読み込んでトークン化することによって生成されます。これにより、別のカテゴリ コード レジームが適用され、このようにして生成される多くの文字トークンは 12(その他) とは異なるカテゴリになります。たとえば、このようにして生成されるアルファベットの文字を表す文字トークンは、通常、カテゴリ 11(文字) になります。\jobname\detokenize

したがって、制御シーケンス トークン\docTypeSvvrまたは は、置換テキストがまたは\docTypeSrsから取得され、したがってカテゴリ 12 (その他) の文字トークンまたはカテゴリ 10 (スペース) のスペースのみで構成されるため、同じ文字がカテゴリ 11 (文字) でトークン化された制御シーケンスの意味とは異なる意味を持ちます。 したがって、2 番目の例との - 比較は- ブランチにルーティングされます。\jobname\detokenize\docTypeExt
\ifx\else

2 番目の例では、/\detokenizeを定義するときにを省略するか、を定義するときにまたは を適用することができます。\docTypeSvvr\docTypeSrs\detokenize\@onelevel@sanitize\docTypeExt

\newlineは、LaTeX に段落 の組版を続行させますが、段落 の別の行を開始させ、その後に空行を続けて、LaTeX に現在の段落を終了させますが、これは冗長に思えます。 は、\baselineskipから垂直方向の値を取得し、がゼロでない場合は\newline垂直方向の値を取得します。がゼロで、段落間に垂直方向のスキップが必要な場所がある場合は、これを乱用せず、またはまたはまたはを使用してください。\parskip\parskip\newline\vspace\addvspave\vskip\smallskip\medskip\bigskip

\newcommand { \docpropPTdocShortcut } {svvr}トークン化の後にスペース トークンが先行する場合\docpropPTdocShortcut、これは良い方法ではありません。ExplSyntax では、トークン化の時点でスペースが無視されるため、次のようにします
\newcommand{\docpropPTdocShortcut}{svvr}

以下の例では、 -route が採用されているため、必要に応じて、\detokenize置換テキストが の展開によって作成されるマクロと安全に比較できます。\jobname

\documentclass{article}


% Given code, defined in included TeX file: 'svvr', 'srs', ...
%% (In case the TeX file in question does not produce text/a chapter of the document, 
%%  \input might be a better choice than \include ...)

\newcommand{\docpropPTdocShortcut}{svvr}% Define document type here!
\gdef\docShortcut{\docpropPTdocShortcut}

% Own TeX file:
\begin{document}
  \edef\docTypeExt{\docShortcut}%%
  \edef\docTypeExt{\detokenize\expandafter{\docTypeExt}}%%
  %\csname @onelevel@sanitize\endcsname\docTypeExt
  %-----------------------------------------------------------------  
  % Specify which document type is to be handled: 'svvr', 'srs', ...
  \edef\docTypeSvvr{\detokenize{svvr}}%%
  \edef\docTypeSrs{\detokenize{srs}}%%

  \noindent
  \verb|\jobname|: \texttt{\jobname}\\
  \verb|\docShortcut|: \texttt{\meaning\docShortcut}\\
  \verb|\docTypeExt|: \texttt{\meaning\docTypeExt}\\
  \verb|\docTypeSvvr|: \texttt{\meaning\docTypeSvvr}\\
  \verb|\docTypeSrs|: \texttt{\meaning\docTypeSrs}

  \vskip\baselineskip

  \noindent
  \ifx\docTypeExt\docTypeSvvr
      true
  \else
      false:\\
      \jobname\\
      \docShortcut\\
      \docTypeSvvr
  \fi

  \vskip\baselineskip

  \noindent
  \ifx\docTypeExt\docTypeSrs
      true
  \else
      false:\\
      \jobname\\
      \docShortcut\\
      \docTypeSrs
  \fi
\end{document}

関連情報