![自动将 := 替换为 \coloneqq](https://linux22.com/image/431311/%E8%87%AA%E5%8A%A8%E5%B0%86%20%3A%3D%20%E6%9B%BF%E6%8D%A2%E4%B8%BA%20%5Ccoloneqq.png)
有没有办法:=
通过命令自动替换\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)