我想将\-
(自由连字符)重新定义为箭头的几个快捷方式的一部分,例如\-> = \rightarrow
或\<- = \leftarrow
,对于经常使用的等价箭头特别有用\<==> = \Longleftrightarrow
。
我的定义到目前为止都没有问题。显然有一个例外:
在小页面或\parbox
宏内恢复到其原始定义!
一个简单的工作示例是:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\renewcommand*{\-}{test}
\begin{document}
\subsection*{Normal}
\verb|\-|: \-\\
\verb|\->|: \->\\
\meaning\- % gives "macro:->test"
\subsection*{Minipage}
\begin{minipage}{\textwidth}
\verb|\-|: \-\\
\verb|\->|: \->\\
\meaning\-\\ % gives "macro:->\discretionary {-}{}{}"
\end{minipage}
\end{document}
对于完整的宏,我使用 xparser 来保留以下默认功能\-
:
\usepackage{xparse}
% \- \->, \-->
\let\minushyphen\-
\DeclareDocumentCommand{\-}{t- t>}{\IfBooleanTF{#2}{%
\ensuremath{\IfBooleanTF{#1}{\longrightarrow}{\rightarrow}}%
}{\minushyphen}}
有人能告诉我为什么小页面中的定义会发生变化以及如何防止这种情况吗?
(如果一切运行稳定,我可以将其作为一个包发布,如果有人感兴趣的话......)
答案1
内部\parbox
、表格p
列minipage
等,各种命令被规范化为已知状态,具体来说,它们都\@arrayparboxrestore
默认运行
\def\@arrayparboxrestore{%
\let\if@nobreak\iffalse
\let\if@noskipsec\iffalse
\let\par\@@par
\let\-\@dischyph
\let\'\@acci\let\`\@accii\let\=\@acciii
\parindent\z@ \parskip\z@skip
\everypar{}%
\linewidth\hsize
\@totalleftmargin\z@
\leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip
\parfillskip\@flushglue \lineskip\normallineskip
\baselineskip\normalbaselineskip
\sloppy}
正如你所见
\let\-\@dischyph
它将重置\-
为其保存的标准定义。这样做的原因是它\-
在环境中具有特殊含义tabbing
,但如果嵌套\parbox
在里面,tabbing
事情就会恢复正常。
因此,您可以重新定义\@arrayparboxrestore
不重置它(或者您可以\@dischyph
在您定义的任何范围内给出您的定义\-
)