我有一个参考的自定义环境。如果我前面没有空格,缩进似乎会发生变化\label
(请参阅下面的 MWE)。因此,我有几个问题:
- 在自定义环境中放置的位置是否重要
\label
;可以改变环境以便我不需要在前面放置空格吗\label
? \label
对于应该放在哪里(在非浮动环境中),是否有一个惯例,或者这是一个风格问题?- 有没有比使用更好的换行方式
\newline
?
请注意,我不想使用,ntheorem
因为我使用的实际版本需要 2 个可选参数(使用newenvironmentx
from xargs
)。
编辑:我特别想尝试回答我的第一个问题 - 是否可以更改环境的定义,以便我不必在 之前\label
或%
之后放置空格?该ntheorem
包似乎使用 来实现这一点trivlist
。
\documentclass{article}
\usepackage{lipsum}
\setlength{\parindent}{0mm}
\newcounter{problem}
\newenvironment{problem}%
{%
\refstepcounter{problem}%
\textbf{Problem \theproblem }\newline%
}{}
\begin{document}
\begin{problem}\label{firstlabel}
\lipsum[1]
\end{problem}
\begin{problem} \label{secondlabel}
\lipsum[1]
\end{problem}
\end{document}
答案1
- 是的。请参阅第 3 条。
- 惯例是将其放在 之后
\caption[..]{...}
,或者更准确地说,放在 之后,\refstepcounter{...}
以便正确标记。否则,标签将引用最近\refstepcounter{...}
执行的先前实例。 - 使用
\par
或\endgraf
代替\newline
。
答案2
我刚刚看到这篇文章,因为我在引用自定义环境时遇到了同样的问题。基于以上所有信息,我找到了解决问题的方法。您只需稍微修改环境的定义,如下所示:
\newcounter{problem}
\newenvironment{problem}%
{%
\refstepcounter{problem}%
\textbf{Problem \theproblem } \par\vspace{-\parskip}%
}{}
我的解释是:当使用\par
而不是\newline
或 时\\
,您不必在 之前\label
或%
之后放置空格。但与此同时,\par
会导致\parskip
。因此,您必须\vspace{-\parskip}
在 之后放置\par
。
我还期待解决这个问题的其他解决方案。
答案3
您需要%
在参数的右括号后立即添加注释字符\label{...}
。这将避免出现您看到的空格。
这就是我在环境、定理等中放置标签的地方。但就像沃纳所说的那样,你不会得到正确的交叉引用。
您是否查看过amsthm
用于制作类似环境的定理的包?
尝试
\documentclass{article}
\usepackage{lipsum}
\usepackage{amsthm}
\newtheoremstyle{mystyle} % Name
{} % Space above
{} % Space below
{} % Body font
{} % Indent amount
{\bfseries} % Theorem head font
{.} % Punctuation after theorem head
{\newline} % Space after theorem head, ' ', or \newline
{} % Theorem head spec (can be left empty, meaning `normal')
\theoremstyle{mystyle}
\newtheorem{problem}{Problem}
\begin{document}
\begin{problem}\label{firstlabel}%
\lipsum[1]
\end{problem}
\begin{problem} \label{secondlabel}%
\lipsum[1]
\end{problem}
\end{document}
哦,这将为您提供正确的交叉引用。