我知道\-
已经用于连字符和 内部tabbing
。我该如何修补此命令,使其执行其他操作,但仅限于数学环境中?我尝试了以下操作:
\documentclass[12pt, preview]{article} % standalone, preview, varwidth=10cm
\usepackage[ngerman]{babel}
\usepackage{xparse, blindtext, etoolbox}
\usepackage{blindtext}
\let\hyphen\-\relax
\def\here{XXXXXXXXXXXX}
%\renewcommand{\-}{\relax\ifmmode(my cmd)\else\hyphen\fi\here}
%\renewrobustcmd{\-}{\relax\ifmmode(my cmd)\else\hyphen\fi\here}
\RenewDocumentCommand{\-}{}{\relax\ifmmode(my cmd)\else\hyphen\fi\here}
\begin{document}
a\-b $a\-b$
\Blindtext
\end{document}
然而我观察到了一些奇怪的效果:
\renewcommand
和\renewrobustcmd
通常会产生相同的结果,但有时\RenewDocumentCommand
会超出范围。当使用该
standalone
课程时,奇怪的事情发生了:- 使用
preview
选项时,所有命令均无法按预期工作,RenewDocumentCommand
版本甚至会抛出错误! Argument of \OT1\" has an extra }
- 没有
preview
(删除盲文)一切都按预期进行
- 使用
到底他妈发生了什么?
答案1
你可能请按如下方式操作,但我不推荐这样做。
\documentclass[12pt]{article}
\usepackage[ngerman]{babel}
\usepackage{etoolbox}
\makeatletter
\robustify\-
\let\latex@hyphen\-
\renewrobustcmd{\-}{%
\ifmmode
(my cmd)%
\else
\expandafter\latex@hyphen
\fi
}
\makeatother
\begin{document}
a\-b
$a\-b$
\end{document}
答案2
我对之前的答案不满意,因为它并非在所有情况下都有效(例如在 tikz-nodes 中)。在最后一次努力中,在尝试了etoolbox
和\appto
变体无济于事后,我尝试了“强力”方法:从 LaTeX2e 手册中复制粘贴并编辑源代码。
% original definition in LaTeX2e
\DeclareRobustCommand{\-}{%
\discretionary{%
\char \ifnum\hyphenchar\font<\z@
\defaulthyphenchar
\else
\hyphenchar\font
\fi
}{}{}%
\fi
}
它运行起来非常顺畅(下面的演示)。当然,最大的缺点是,如果 LaTeX2e 源发生变化,则更改不会自动延续。这引发了一个问题:
在 LaTeX 中是否有任何方法可以实现 100% 相同的行为,而无需复制粘贴源代码?
编辑:我发布了一个新问题:在命令中预先添加和附加代码的明确方法?好像没有(!)
\documentclass[12pt]{article} % also works in [preview]standalone
\usepackage[ngerman]{babel}
\usepackage{blindtext, tikz}
\usepackage{xparse, etoolbox}
\usepackage{amsmath}
\def\hyphen{\textbf{(hyphen)}}
\def\mycmd{\textbf{(my cmd)}}
\makeatletter
\undef{\-}
\DeclareRobustCommand{\-}{%
\ifmmode
\mycmd
\else
%\@dischyph%
\discretionary{%
\char \ifnum\hyphenchar\font<\z@
\defaulthyphenchar
\else
\hyphenchar\font
\fi
}{}{}%
\hyphen% (just for debugging purpose)
\fi
}
\makeatother
\begin{document}
\par text\-text
\par $math\-math$
\par $\text{text inside math \- text inside math}$
\section*{sections: test\-test $math\-math$}
\begin{figure}
\begin{tikzpicture}
\node[draw] at (0,0) {tikz node};
\node[draw] at (6,0) {text\-text $math\-math$};
\end{tikzpicture}
\caption{text\-text $math\-math$}
\end{figure}
\Blindtext
\end{document}