重新定义 \- 的安全方法仅适用于数学模式

重新定义 \- 的安全方法仅适用于数学模式

我知道\-已经用于连字符和 内部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}

相关内容