答案1
对于以不同的宏开始和结束的情况,只需将\ensuremath
in 的定义拆分为两个即可。因此
\relax\ifmmode\let\myend\relax\else$\def\myend{$}\fi
在第一个宏定义的开始处
\myend
在第二个的末尾。
但是请注意,如果软件包作者遵循语法指南,那么像 LaTeX 这样的格式效果最好,这样整个语言或多或少会保持连贯一致。TeX 在数学模式和文本模式之间做出了很大的区分,这\.
与例如不同\dot
,用户需要知道他们是处于数学模式还是文本模式。有时对于一些小符号,用户可能不需要知道数学模式正在内部使用,这\ensuremath
很有用,但对于像采用用户提供的参数的向量这样的东西,使用它通常不是一个好主意,因为用户在任何情况下都需要知道提供的参数被处理为数学。比较标准的 LaTeXarray
环境,这与除了每个单元格都处于数学模式之外完全相同tabular
,但是环境不会隐式地切换到数学模式,而是检查它是否已经处于数学模式,如果不是,则会出错。因此,用户需要在使用之前切换到数学array
。此错误检查纯粹是为了保持语言一致性,array
否则环境将以相同的方式在文本或数学中工作。类似的考虑适用于参数结构。LaTeX 命令绝不采用可变数量的{}
参数。{}
参数应为强制参数。可选参数应为[]
,可变数量的项目应以逗号分隔的列表形式列出,因此,与向量可以是任意长度相比,这种\colvec{a,b}
语法与 latex 的兼容性要好得多。\colvec{a}{b}
答案2
我听取了 David Carlisle 的建议并在这里找到了一个使用逗号分隔的参数列表的解决方案。自定义命令的参数是否以逗号分隔列表?真的帮助了我。
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand\rcvector[2][\\]{\ensuremath{%
\global\def\rc@delim{#1}%
\negthinspace\begin{pmatrix}
\rc@vector #2,\relax\noexpand\@eolst%
\end{pmatrix}}}
\def\rc@vector #1,#2\@eolst{%
\ifx\relax#2\relax
#1
\else
#1\rc@delim
\rc@vector #2\@eolst%
\fi}
\makeatother
\newcommand{\colvect}{\rcvector}
\newcommand{\rowvect}{\rcvector}
\begin{document}
\colvect{ct,x,y,z}\rowvect[,\;]{ct,x,y,z}
\end{document}