为什么这个 ~ 空格不能在 ExplSyntax 命令中打印?

为什么这个 ~ 空格不能在 ExplSyntax 命令中打印?

我知道这\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}

相关内容