我尝试使用该包编写一个宏来排版语义符号,stmaryrd
但有几个问题我想解决。我对该宏的第一次尝试如下:
\documentclass{article}
\usepackage{stmaryrd}
\newcommand{\den}[2][]{$\llbracket$#2$\rrbracket^{#1}$}
\begin{document}
\den[w,g]{example} = \ldots
\end{document}
我想解决的问题是,在某些情况下,括号之间的文本会变得很长,而且很难看,因为它跨越多行。(似乎我还不能插入图片,但它看起来像下面这样。)
[[这是一个故意写的很长的句子,我想具体说明它的含义,但是因为它太长了,所以跨越了多行,结果既很难阅读,而且从美学上来说也相当粗糙]] = . . .
现在,stmaryrd
写成使得\llbracket
和\rrbracket
是分隔符,因此我尝试了这个:
\documentclass{article}
\usepackage{stmaryrd}
\newcommand{\den}[2][]{
\[
\left\llbracket#2\right\rrbracket^{#1}
\]
}
\begin{document}
\den{example}
\end{document}
我不太熟悉分隔符,但似乎无法在\left
和\right
命令之间插入换行符,因此无法将括号内的文本拆分为多行。第二次尝试还将符号居中并将括号内的文本斜体化,这是我做的两件事不是想要发生。
关于第一个问题,是否有某种方法可以限制括号内文本的水平空间,也许可以使用命令\parbox
?当然,文本必须在有限的水平空间内换行,但这是我自己不知道该怎么做的事情。理想情况下,水平空间的大小将成为新命令的可选参数\den
,以便可以在必要时指定或缩放它。
答案1
我会用稍微不同的方式来做这件事(采纳您的建议\parbox
)。我创建了第二个命令来包装较长的符号。然后,您可以根据需要使用它来将较长的符号包装到指定的宽度(我已将默认宽度设置为 1 英寸)。我还使用该ragged2e
包将长文本用参差不齐的边距和连字符包装起来,并将符号的整个参数放在命令中,amsmath
\text
以便文本为罗马字体而不是数学斜体。最后,通过使用内联模式而不是 displaymath,我们可以将符号左对齐以用于示例环境。
更新
我使用这个varwidth
包将文本换行放在一个框中,使其保持自然宽度。感谢 David Carlisle 告诉我这个包。我还附上了一个示例,gb4e
以展示它们的外观。
\documentclass{article}
\usepackage{stmaryrd}
\usepackage{amsmath}
\usepackage{ragged2e}
\usepackage{varwidth}
\newcommand{\den}[2][]{
\(
\left\llbracket\;\text{#2}\;\right\rrbracket^{#1}
\)
}
\newcommand{\wraptext}[2][1in]{\begin{varwidth}{#1}{\RaggedRight#2}\end{varwidth}}
\begin{document}
\den[\alpha]{\wraptext[3in]{example of a really long denotation which will continue as long as we like}}
\den[\alpha]{\wraptext[2in]{example of a really long denotation which will continue as long as we like}}
\den[\alpha]{a smaller one}
\end{document}
答案2
一个简单的实现可以是
\documentclass{article}
\usepackage{stmaryrd}
\newcommand\den[2][]{%
\ensuremath{%
\left\llbracket
\begin{tabular}{@{}l@{}}
#2
\end{tabular}
\right\rrbracket^{#1}}}
\begin{document}
Test \den{foo} and
\[
\den[\beta]{some text\\ others} = \Gamma
\]
\end{document}
环境tabular
提供了按您的意愿(明确地)换行的能力。因此您无需指定文本的宽度。
当然还有更多的可能性,但我相信这个简单的实现很容易理解。如果您有更多要求,请告诉我。