自动将 := 替换为 \coloneqq

自动将 := 替换为 \coloneqq

有没有办法:=通过命令自动替换\coloneqq

我希望仍然能够输入:=文件.tex,但它会编译符号\coloneqq

在某种程度上,我问的是是否有可能做类似的事情\newcommand{:=}{\coloneqq}

谢谢

PS:如果可能的话,我正在寻找与之兼容的解决方案\usepackage[french]{babel}

答案1

babel-french使用 时,请勿尝试使用pdflatex。如果您使用 XeLaTeX 或 LuaLaTeX,它应该可以正常工作。

\documentclass{article}
\usepackage{mathtools}

\AtBeginDocument{%
  \mathchardef\ordinarycolon=\mathcode`:
  \mathcode`:="8000
}
\makeatletter
\newcommand{\coloncheck}{\@ifnextchar={\coloneqq\@gobble}{\ordinarycolon}}
\makeatother
\begingroup\lccode`~=`: \lowercase{\endgroup\let~}\coloncheck

\begin{document}

$a := b$ $a \ordinarycolon= b$ $a:b$

\end{document}

重新定义\ordinarycolon是必要的。

在此处输入图片描述

对于babel-french,根据pdflatex

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{mathtools}

\AtBeginDocument{%
  \mathchardef\ordinarycolon=\mathcode`:
  \mathcode`:="8000
}
\makeatletter
\declare@shorthand{french}{:}{%
  \ifmmode
    \expandafter\coloncheck
  \else
    \ifFB@spacing
      \ifhmode
        \ifdim\lastskip>1sp
          \unskip\penalty\@M\FBcolonspace
        \else
          \FDP@colonspace
        \fi
      \fi
    \fi
  \string:%
  \fi
}
\newcommand{\coloncheck}{\@ifnextchar={\coloneqq\@gobble}{\ordinarycolon}}
\makeatother
\begingroup\lccode`~=`: \lowercase{\endgroup\let~}\coloncheck


\begin{document}

Un example: et voilà.

$a := b$ $a \ordinarycolon= b$ $a:b$

\end{document}

在此处输入图片描述

答案2

这是一个tokcycle无论是否[french]{babel}加载都可以使用的解决方案。如果未加载,它会在 Character 指令中拦截法线:。如果加载,它必须在 Macro 指令中拦截它。

只需用 围住所需的测试区域即可\subcoloneqq...\endsubcoloneqq。它可以在 之后开始\begin{document}并在 之前结束\end{document}

补充为了未来的改进。

\documentclass{article}
\usepackage{tokcycle,mathtools}
\usepackage[french]{babel}
\def\coltype{}
\newcommand\notcoleq{\ifcolon\addcytoks[1]{\coltype}\fi\colreset}
\newcommand\colreset{\colonfalse\def\coltype{}}
\newif\ifcolon
\stripgroupingtrue
\tokcycleenvironment\subcoloneqq
%%% CHARACTER DIRECTIVE
{%
\tctestifx{=##1}
  {\tctestifcon{\ifcolon}
    {\addcytoks{\coloneqq}\colreset}
    {\notcoleq\addcytoks{##1}}%
  }
  {\tctestifx{:##1}
    {\colontrue\def\coltype{##1}}
    {\notcoleq\addcytoks{##1}}%
  }%
}
%%% GROUP DIRECTIVE
{\notcoleq\groupedcytoks{\processtoks{##1}\notcoleq}}
%%% MACRO DIRECTIVE
{\tctestifcon{\if\detokenize{:}\detokenize{##1}}
  {\colontrue\def\coltype{##1}}
  {\notcoleq\addcytoks{##1}}}
%%% SPACE DIRECTIVE
{\notcoleq\addcytoks{##1}}
%%%
\begin{document}
\subcoloneqq
Un example: et voilà.

$a := b$ $a \ordinarycolon= b$ $a:b$
\endsubcoloneqq
\end{document}

在此处输入图片描述


补充

我最近开始了一个tokcycle软件包改进周期,以向令牌周期添加前瞻功能。在上述“标准”方法中,一次只能在输入流中处理一个令牌。因此,要查找多字节序列,我必须设置标志和宏,以便一个指令可以与另一个指令进行通信。

编辑:tokcycle[2021-05-27]已发布,其中包含用于提前查看输入流的代码。因此,\makeatletter代码已从此补充中删除。如您所见,\subcoloneqq环境的指令变得大大简化。

\documentclass{article}
\usepackage{tokcycle,mathtools}
\usepackage[french]{babel}
\newcommand\coleqchek[1]{\tcpeek\z
  \ifx=\z\tcpop\z\addcytoks{\coloneqq}\else\addcytoks{#1}\fi}
\tokcycleenvironment\subcoloneqq
%%% CHARACTER DIRECTIVE
{\tctestifx{:##1}{\coleqchek{##1}}{\addcytoks{##1}}}
%%% GROUP DIRECTIVE
{\processtoks{##1}}
%%% MACRO DIRECTIVE
{\tctestifcon{\if\detokenize{:}\detokenize{##1}}
  {\coleqchek{##1}}{\addcytoks{##1}}}
%%% SPACE DIRECTIVE
{\addcytoks{##1}}
%%%
\begin{document}
\subcoloneqq
Un example: et voilà.

$a := b$ $a \ordinarycolon= b$ $a:b$
\endsubcoloneqq
\end{document}

答案3

在带有 AUCTeX 的 Emacs 中,您可以使用这个 ELisp:

(defun user/insert-coloneqq ()
 (interactive)
 (when (eq (char-before) ?:)
  (delete-char -1)
  (insert "\\coloneqq")))
(define-key LaTeX-mode-map (kbd "=") 'user/insert-coloneqq)

相关内容