我知道这\ExplSyntaxOn
会改变空格的解释方式。我用它~
来表示空格,但在本例中,其中一个波浪符号没有被打印出来。
\documentclass[a4paper,10pt,openany]{scrbook}
\usepackage{ifthen}
\usepackage{xparse}
\ExplSyntaxOn
% Degrees Celcius.
\newcommand{\dc}[1]
{
#1$^\circ$C
}
% Arguments: temperature (celsius) minumum minutes, maxiumum minutes, "until".
% "maximum minutes" may be blank.
% "until" may be blank.
\newcommand{\bakeat}[4]
{
Bake~at~\dc{#1}~for~
\ifthenelse
{\equal{#3}{}}
{#2}
{#2~to~#3}
~minutes
\ifthenelse{\equal{#4}{}}{.}{~until~#4.}
}
\begin{document}
\bakeat{180}{10}{15}{}
\end{document}
呈现方式如下:
它打印的是15minutes
而不是,尽管宏定义中的15 minutes
单词前显然有一个波浪符号。其他波浪符号按预期工作。minutes
为什么这个特定的波浪符号空格不能打印?
答案1
行首的空格(包括~
)会被忽略;另一方面,~
行末的空格不会被忽略。
\newcommand{\bakeat}[4]
{
Bake~at~\dc{#1}~for~
\ifthenelse
{\equal{#3}{}}
{#2}
{#2~to~#3}~
minutes
\ifthenelse{\equal{#4}{}}{.}{~until~#4.}
}
另一方面,当你使用时,expl3
使用全部其特点。
\documentclass[a4paper,10pt,openany]{scrbook}
\usepackage{xparse}
\usepackage{siunitx}
\ExplSyntaxOn
% Degrees Celsius.
\NewDocumentCommand{\dc}{m}
{
\SI{#1}{\celsius}
}
% Arguments: temperature (celsius) minumum minutes, maxiumum minutes, "until".
% "maximum minutes" may be blank.
% "until" may be blank.
\NewDocumentCommand{\bakeat}{mmmm}
{
Bake~at~\dc{#1}~for~#2
\tl_if_blank:nF { #3 } { ~to~#3}~minutes
\tl_if_blank:nF { #4 } { ~until~#4}.
}
\ExplSyntaxOff
\begin{document}
\bakeat{180}{10}{}{}
\bakeat{180}{10}{15}{}
\bakeat{180}{10}{15}{ready}
\end{document}
你可能会喜欢更方便的语法:
\documentclass[a4paper,10pt,openany]{scrbook}
\usepackage{xparse}
\usepackage{siunitx}
\ExplSyntaxOn
% Degrees Celsius.
\NewDocumentCommand{\dc}{m}
{
\SI{#1}{\celsius}
}
\NewDocumentCommand{\bakeat}{m >{\SplitArgument{1}{-}}m o}
{
Bake~at~\dc{#1}~for~\bakerange#2~minutes
\IfValueT { #3 } { ~until~#3 }.
}
\NewDocumentCommand{\bakerange}{mm}
{
#1\IfValueT{#2}{~to~#2}
}
\ExplSyntaxOff
\begin{document}
\bakeat{180}{10}
\bakeat{180}{10-15}
\bakeat{180}{10-15}[ready]
\end{document}