变量简写导致名称冲突

变量简写导致名称冲突

在公式中,我经常需要相同的常量和变量以及大量的“组成”。

我想要有可读且可维护的 LaTeX 代码,所以我想到了编写 \newcommand如下代码

\newcommand*{\Cref}{C_{\textrm{ref}}} %very short example
..
\[ \Cref \cdot U = Q \]

但已被等\Cref使用……\usepackage{cleveref}

最后,我很快就用完了简短而漂亮的命令。

我正在寻找遇到过同样问题并且有绝妙想法的人。

答案1

定义\Cref它在不同上下文中执行不同的事情(例如,它是否有空参数,或者它处于数学或文本模式)绝对是不可取的,因为它会造成混淆。

您可以定义一个“快捷方式”生成命令:

\makeatletter
\newcommand{\scut}[1]{\@nameuse{myscut@#1}}
\newcommand{\defineshortcut}[2]{\global\@namedef{myscut@#1}{#2}}
\makeatother

然后你可以在序言中设置

\defineshortcut{Cref}{C_{\textnormal{ref}}}

\scut{Cref}并在文档中使用。你甚至可以说

\defineshortcut{C_ref}{C_{\textnormal{ref}}}

\scut{C_ref}如果您愿意,可以使用。

如果\scut感觉太长,可以使用较短的序列;\s是免费的,而\S打印§(因此可以重新定义它,但要小心,因为有些文档可以使用原始命令)。


可以使用“一个字符的快捷方式”,例如|"(如果babel未使用);以下定义也允许使用与相同语法的“参数化”快捷方式\newcommand

\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand{\scut}[1]{\@nameuse{myscut@shortcut@#1}}
\newcommand{\defineshortcut}[1]{\expandafter\newcommand\csname myscut@shortcut@#1\endcsname}
\newcommand{\useshortcutsymbol}[1]{%
  \global\expandafter\chardef\csname myscut@catcode@#1\endcsname\catcode`#1\relax
  \catcode`#1=\active
  \begingroup\lccode`~=`#1\relax
  \lowercase{\endgroup\def~##1~}{\@nameuse{myscut@shortcut@##1}}}
\newcommand{\undefineshortcutsymbol}[1]{%
  \catcode`#1\csname myscut@catcode@\string#1\endcsname}
\makeatother

\defineshortcut{C}[1]{C_\textnormal{#1}}
\defineshortcut{Cref}{C_\textnormal{ref}}

\begin{document}
\useshortcutsymbol{|}

$\scut{C}{ref}\quad\scut{Cref}$

$|C|{ref}\quad|Cref|$

\undefineshortcutsymbol{|}

$|C|$

\end{document}

但是我不会使用这种“太短”的快捷方式,因为这样很容易出错。该\useshortcut命令应该收到非特殊ASCII 字符作为其参数;高位设置字符肯定不安全,因为它们在不同的编码中被区别对待。

答案2

这是一种简单的方法:为下标“ref”创建一个命令。

 \newcommand*\sref{_{\textrm{ref}}}

这使得“ref”类似于变音符号或运算符:这使得在文本中系统地引用“ref”变量变得更加容易。我经常用同样的方式定义转置和厄米伴随,例如

 \newcommand*\trans{^{\textsf{T}}}
 \newcommand*\herm{^\dagger} 

答案3

在其他编程语言中,这通常使用以下方法解决命名空间对于 LaTeX,有名称提供的包

LaTeX 中类似 C++ 的基本命名空间。

例子:

\documentclass{scrartcl}
\pagestyle{empty}

\usepackage{amsmath}
\usepackage{namespc}
\usepackage{cleveref}
%
\newcommand{\overwritecommand}[1]{\let#1\undefined\newcommand{#1}}
%
\begin{document}
  \section{First section}
  \label{sec:first}

  \namespace{shortcuts}{%
    \overwritecommand{\Cref}{mycref}
  }{}

  This is the original definition: \Cref{sec:first}

  \begin{shortcuts}
    This is used from within the ``shortcuts'' environment: \Cref
  \end{shortcuts}

  \begin{align*}
    \usingnamespace{shortcuts}
    \text{Equation} = \text{\Cref}
  \end{align*}

  This is to access the macro explicitly: \::shortcuts::Cref::
\end{document}

在此处输入图片描述

说实话,我只是通过专门的搜索才找到它的,我以前从未见过它被使用。从现在起,我将用它来解决您描述的问题。

相关内容