次のコマンドのif条件

次のコマンドのif条件

独自の環境を構築し始めた後、次のコマンドが何であるかを確認し、次のコマンドの前に何かを実行するオプションを提供する if 条件があるかどうか疑問に思いました。私が探している擬似コードの例:

\newenvironment{test}{
    ifnext{\begin{itemize}}{true: do something}{false: do other things}
    }
    {
}

答え1

LaTeX にはマクロ があります\@ifnextchar。名前は少し誤解を招くかもしれませんが、次の 1 文字をテストするだけでなく、定義された意味を持つマクロにも使用できます。たとえば、入力ストリームの次の文字が であるかどうかをテストできます\begin

これを使用してマクロを構築できます\ifnextenv。マクロは、環境の名前、その環境が後に続く場合に実行されるコード、およびそれ以外の場合に実行されるコードの 3 つの引数を取ります。マクロは、入力ストリーム内の次のもの (3 つの引数の後) が であるかどうかを確認します。その場合、マクロは を使用しての最初の引数が の最初の引数\beginと一致するかどうかを確認します。\begin\ifnextenv\pdf@strcmp

次に、テストの結果に応じてブランチを挿入します。

この使用例では、no followsの後に if を\ifnextenv自動的に挿入するために使用します。itemize\begin{test}\begin{enumerate}

\documentclass[]{article}

\usepackage{pdftexcmds}

\makeatletter
\newcommand\ifnextenv[3]
  {%
    \@ifnextchar\begin{\@ifnextenv{#1}{#2}{#3}}{#3}%
  }
\newcommand\@ifnextenv[5]
  {%
    \ifnum\pdf@strcmp{#1}{#5}=0
      \expandafter\@firstoftwo
    \else
      \expandafter\@secondoftwo
    \fi
    {#2}
    {#3}%
    \begin{#5}%
  }
\makeatother

\newenvironment{test}
  {%
    \ifnextenv{enumerate}
      {\def\test@end{}}
      {\def\test@end{\enditemize}\itemize}%
  }
  {%
    \test@end
  }

\begin{document}
\begin{test}
\item foo
\item bar
\end{test}

\begin{test}
  \begin{enumerate}
    \item foo
    \item bar
  \end{enumerate}
\end{test}
\end{document}

ここに画像の説明を入力してください

答え2

トークンサイクルを使用してこれを行う方法を次に示します。

を見つけるたびに\begin{itemize}、 を事前実行します。\PREitemizeここでは に設定します。 が検出されたが ではない\par Hi Mom, I am about to itemize場合は、 を事前実行します。ここでは に設定します。\beginitemize\PREbegin\par Sorry, this begin is not itemize

\documentclass{article}
\usepackage{tokcycle}
\def\ITM{itemize}
\def\TRUESET{T}
\def\PREitemize{\par Hi Mom, I am about to itemize}
\def\PREbegin{\par Sorry, this begin is not itemize}
\stripgroupingtrue
\tokcycleenvironment\finditemize
{\addcytoks{##1}}
{\tctestifx{\TRUESET\BEGgo}%
  {\def\tmp{##1}\tctestifx{\ITM\tmp}%
    {\addcytoks[1]{\PREitemize}}{\addcytoks[1]{\PREbegin}}
    \addcytoks{\begin{##1}}}%
  {\addcytoks{{##1}}}%
 \def\BEGgo{F}%
}
{\tctestifx{\begin##1}{\def\BEGgo{T}}{\addcytoks{##1}}}
{\addcytoks{##1}}
\begin{document}
\finditemize
Here is a test
\begin{itemize}
\item A
\begin{itemize}
\item A.1
\item A.2
\end{itemize}
\item B
\item C
\end{itemize}
\begin{enumerate}
\item A
\item B
\item C
\end{enumerate}
\endfinditemize
\end{document}

ここに画像の説明を入力してください

関連情報