thmtools - 自定义头部格式插入空格

thmtools - 自定义头部格式插入空格

我在用thmtools创建锻炼环境。我寻找的格式是:

  • 演习编号(粗体)
  • 句号和空格
  • 如果使用 键设置了练习注释name,则注释将以粗体显示,并留出另一个空格
  • 运动身体

我遇到的问题是,设置注释时会出现一些额外的水平间距。此外,如果选项块为空,则会插入更多额外空间。以下是 MWE:

\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}

\declaretheoremstyle[
    headfont=\bfseries,
    notefont=\bfseries,
    headformat={\NUMBER.\if\NOTE\ \else \NOTE\fi},
    headpunct={},
    notebraces={}{},
    numbered=yes
]{exercise}
\declaretheorem[style=exercise]{exercise}

\begin{document}

\begin{exercise}foo\end{exercise}
\begin{exercise}[
    ] bar 
\end{exercise}
\begin{exercise}[name=Baz]baz\end{exercise}

\end{document}

MWE 输出

如果没有headformat设置该键,我就得不到任何额外的空格,但这当然不是我想要的格式。那么我该如何设置headformat才能得到我想要的而没有额外的空格呢?

答案1

\NOTE不只包含注释文本,它是一个更复杂的宏。

用这个你可以得到你想要的东西:

\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools,etoolbox}

\declaretheoremstyle[
    headfont=\bfseries,
    notefont=\bfseries,
    headformat={\NUMBER.\NOTEifnotblank},
    headpunct={},
    notebraces={}{},
    numbered=yes
]{exercise}
\declaretheorem[style=exercise]{exercise}

\makeatletter
\newcommand{\NOTEifnotblank}{%
  \expandafter\getreal@NOTE\NOTE\@nil
}
\def\getreal@NOTE\if=#1=#2\@nil{\ifblank{#1}{}{\unskip\textnormal{\ }#1}}
%% fix the error if the optional argument is specified but empty
\let\thmt@shortoptarg\@empty
\makeatother

\begin{document}

\begin{exercise}
foo
\end{exercise}
\begin{exercise}[ ]
bar 
\end{exercise}
\begin{exercise}[]
bar 
\end{exercise}
\begin{exercise}[name=Baz]
baz
\end{exercise}

\end{document}

在此处输入图片描述

答案2

在文件中thm-amsthm.sty,的格式指令NOTE没有考虑到“空”选项的可能性,这是否意味着只有括号,[]在这种情况下它会崩溃并显示消息

! Undefined control sequence.
\ll@exercise ...mtformatoptarg {\thmt@shortoptarg 
                                              }\fi 
l.22 \begin{exercise}[]

或者使用您已有的空格。

可以应用补丁来删除不需要的空格。在定义中

\def\thmt@setheadstyle#1{%

更换线路

\def\NOTE{\if=##3=\else\bgroup\thmt@space\the\thm@notefont(##3)\egroup\fi}%

\def\NOTE{\if=##3=\else\bgroup\thmt@space\the\thm@notefont(\ignorespaces##3)\egroup\fi}%

\ignorespaces将会起到作用。

相关内容