我需要一些幫助來理解 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}
如果您不知道什麼標記永遠不會作為參數的第一個標記出現,那麼您可以使用\detokenize
eTeX 中的可擴展原語,例如:
\if\penalty\detokenize{#1}\penalty the parameter empty.\else non-empty.\fi