使用带有空参数的 \if

使用带有空参数的 \if

我想修改一段代码,即Friedhelm Sowa的picinpar.sty。

有命令

\figwindow[#1,#2,#3,#4]

在段落开头下方位置 #2 处插入一张图片 (#3) #1 行,标题为 #4

在 picinpar.sty 文件中,此命令定义为

 \long\def\figwindow[#1,#2,#3,#4] {%
   \advance\c@figure -1
   \begin{window}[#1,#2,{#3},{\def\@captype{figure}%
    \wincaption#4\par}] %
  }

我不会在这里进一步探讨窗口环境的含义,这与我的问题无关。我想要实现的是不打印标题的选项。如果我将 figwindow 重写为

 \long\def\figwindow[#1,#2,#3,#4] {%
  \advance\c@figure -1
  \begin{window}[#1,#2,{#3},{}]%
 }

我的想法是使用一个条件,如果 #4 是 {},则不打印标题,否则打印标题。我的尝试是:

 \long\def\figwindow[#1,#2,#3,#4] {%
  \advance\c@figure -1
  \begin{window}[#1,#2,{#3},\if #4{} {} \else   {\def\@captype{figure}%
    \wincaption#4\par}\fi]
}

不幸的是,这不起作用。如果我调用

\figwindow[#1,#2,#3,{}]

或 \figwindow[#1,#2,#3,]

但是,将样式修改为与“*”进行比较而不是与空标记进行比较则可以完美地工作:

\long\def\figwindow[#1,#2,#3,#4] {%
 \advance\c@figure -1
 \begin{window}[#1,#2,{#3},\if #4* {} \else {\def\@captype{figure}%
    \wincaption#4\par}\fi]
 }

\figwindow[#1,#2,#3,*]

虽然我有一个可行的解决方案,但我更愿意让 {} 起作用(对我来说它看起来更直观令人惊讶的是

\newcommand{\Compare}[2]{#1  \if #2{} EMPTY \else --- #2 ---\fi\par}
\Compare{EMPTY}{}
\Compare{FILLED}{HOW?}

正如我预期的那样,它的输出是

空 - 空 -

已填充 - 如何填充? -

有什么建议吗?现在就提前谢谢您

答案1

\if #2{}\else ...#2...\fi

扩展#2并比较前两个不可扩展的标记,因此

如果#2aabbcc真,则采用分支并扩展为bbcc{}

如果#2是,则a比较并采用错误分支,跳过a{}

如果#2为空,则{}false进行比较

你可以#2使用以下命令测试是否为空

\if\relax\detokenize{#2}\relax\else ...#2...\fi

因为\detokenize永远不会返回一个用 测试为真的命令标记\relax(所有不可扩展的命令标记用 测试相等\if),但如果#2为空,则为\if\relax\relax真。

相关内容