If 語句和變數

If 語句和變數

我需要一些幫助來理解 if 語句。

如何在 LaTeX 中編寫以下偽代碼。

\newcommand{\@leader}{}
\newcommand{\leader}[1]{\renewcommand\@leader{#1}}

\newcommand{\donow}{
    \if \@leader == {}        %aka blank, null, empty
        this is the false     %do false
    \else   
        \@leader              %do leader
    \fi
}

這樣當使用者將以下內容新增到他們的文件中時

\leader{
    \begin{itemize}
        \item this is an item
        \item this is also an item
    \end{itemize}
}

\donow

\leader{}

\donow

列印以下內容

*This is an item

*this is also an item

this is the false

關於變數我唯一的問題是,我的解決方案真的是創建變數的最佳方法嗎?

答案1

您可以使用 測試巨集到巨集\ifx。也就是說,\ifx<csA><csB><true>\else<false>\fi將測試 的定義是否與和execute的定義<csA>相符,否則:<csB><true><false>

在此輸入影像描述

\documentclass{article}

\makeatletter
\newcommand{\@emptymacro}{}% Used to test against an empty macro
\newcommand{\@something}{}
\newcommand{\something}[1]{\renewcommand\@something{#1}}

\newcommand{\donow}{%
  \ifx\@something\@emptymacro %aka blank, null, empty
    this is the false     %do false
  \else
    \@something           %do something
  \fi
}
\makeatother

\begin{document}
\something{%
  \begin{itemize}
    \item this is an item
    \item this is also an item
  \end{itemize}
}

\donow

\something{}

\donow

\end{document}

etoolbox提供類似的檢查機制:

\usepackage{etoolbox}
\makeatletter
\newcommand{\@something}{}
\newcommand{\something}[1]{\renewcommand\@something{#1}}

\newcommand{\donow}{%
  \ifdefempty{\@something}{%aka blank, null, empty
    this is the false     %do false
  }{%
    \@something           %do something
  }%
}
\makeatother

答案2

給定任務的標準 TeX 程式碼是:

\def\something#1{\def\internal{#1}%
   \ifx\internal\empty the parameter is empty.\else it is nonempty.\fi
}

這段程式碼(上面)的問題是巨集\something不可擴展,因為它包含\def賦值。如果您需要具有相同測試的可擴展宏,那麼您需要選擇從未用作參數中第一個標記的標記(?在我們的範例中),您可以編寫:

\def\something#1{\ifx?#1?the parameter is empty.\else it is nonempty.\fi}

如果您不知道什麼標記永遠不會作為參數的第一個標記出現,那麼您可以使用\detokenizeeTeX 中的可擴展原語,例如:

\if\penalty\detokenize{#1}\penalty the parameter empty.\else non-empty.\fi

相關內容