我正在排版课本练习的答案。我使用名为包装器ntheorem
的定理question
来处理问题。有些答案以常规文本开头,我希望它们与开头的 XX 号问题在同一行开始。
为了实现这一点,我定义了
\usepackage{ntheorem}
\theoremstyle{plain}
\newtheorem{question}{Question}
lstlisting
然而,有些答案只是我用自定义环境排版的一段代码
\usepackage{listings}
\lstnewenvironment{lstcaml}[1][]{\lstset{language=[Objective]caml, frame=single, frameround=tttt, #1}}{}
在环境中question
。在这种情况下,我希望列表从下一行开始,以进行代码缩进,并让其周围有一个完整的框架。
它没有像我预期的那样工作:
来自于
\begin{document}
\begin{question}
Some text
\begin{lstcaml}
Some code
\end{lstcaml}
\end{question}
\begin{question}
\begin{lstcaml}
Some code
\end{lstcaml}
\end{question}
%% the same follows without borders for listings
我试图\par
在我的列表环境的定义中添加一个,但无济于事(我不得不作弊,\let\mypar\par
因为这些标记似乎是在非定义中使用\long
)。
一开始手动输入\ \\
是可行的,但是很麻烦,而且我认为它占用了比所需更多的垂直空间。
答案1
在定理标题后面有一个诸如字母 或\strut
或 之类的内容就足够了:\leavevmode
\begin{question}\leavevmode
\begin{lstcaml}
Some code
\end{lstcaml}
\end{question}
要对所有实例执行此操作,您可以定义自己的定理样式。在这里,我采用了定理样式,plain
并\strut
在定理标题外添加了一个(\theoremseparator
出现在标题内,不能用于此)。总 MWE 变为:
\documentclass{article}
\usepackage{ntheorem}
\makeatletter
\newtheoremstyle{myplain}%
{\item[\hskip\labelsep \theorem@headerfont ##1\ ##2\theorem@separator]\leavevmode}%
{\item[\hskip\labelsep \theorem@headerfont ##1\ ##2\ (##3)\theorem@separator]}
\makeatother
\theoremstyle{myplain}
\newtheorem{question}{Question}
\usepackage{listings}
\lstnewenvironment{lstcaml}[1][]{\lstset{language=[Objective]caml, frame=single, frameround=tttt, #1}}{}
\begin{document}
\begin{question}
Some text
\begin{lstcaml}
Some code
\end{lstcaml}
\end{question}
\begin{question}
\begin{lstcaml}
Some code
\end{lstcaml}
\end{question}
\end{document}
编辑
正如 ysalmon 所指出的,通过在定义\leavevmode
中设置也可以实现相同的效果lstcaml
。然后序言变成:
\usepackage{ntheorem}
\theoremstyle{plain}
\newtheorem{question}{Question}
\usepackage{listings}
\lstnewenvironment{lstcaml}[1][]{\leavevmode\lstset{language=[Objective]caml, frame=single, frameround=tttt, #1}}{}