下一個指令的 if 條件

下一個指令的 if 條件

在我開始建立自己的環境後,我想知道是否有一個 if 條件,它檢查下一個命令是什麼,然後提供在下一個命令之前執行某些內容的選項。我正在搜尋的偽代碼範例:

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

答案1

LaTeX 有宏\@ifnextchar.這個名稱可能有點誤導,您不僅可以用它來測試下一個單個字符,還可以用它來測試具有定義含義的宏,例如,您可以測試輸入流中的下一個內容是否是\begin

這可以用來建構巨集\ifnextenv。它將採用三個參數:環境名稱、如果該環境遵循該環境則將執行的程式碼以及否則將執行的程式碼。該宏將檢查輸入流中的下一個內容(在其三個參數之後)是否是\begin.如果是這種情況,它將檢查第一個參數是否與使用的\begin第一個參數匹配\ifnextenv\pdf@strcmp

然後它會根據測試的結果插入分支。

此用法範例用於在no follow之後\ifnextenv自動插入if 。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。如果有\begin偵測到但沒有itemize,我就預先執行\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}

在此輸入影像描述

相關內容