我在用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}
如果没有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
将会起到作用。