我想创建一个命令,将所有文本都转换为小写字母并放在矩阵中。这是下面的 \fmold。这给了我一个错误,提示我创建一个 foreach 循环,如 \smallcapsify 和 \fm 中所示。有什么好的解决方案吗?为什么这两种解决这个问题的方法都不起作用?
\documentclass[10pt]{article}
\usepackage[margin = .5in]{geometry}
\usepackage[T1]{fontenc}
\usepackage{mathtools}
\usepackage{stmaryrd}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{xstring}
\newcommand{\smallcapsify}[1]{
\foreach \x in {#1}{\textsc{\x}\\}}
\newcommand{\fm}[1]{$
\left[
\begin{matrix}
\smallcapsify{#1}
\end{matrix}
\right] $}
\begin{document}
\fmold{a\\b\\c}
\smallcapsify{a,b,c}
\fm{a,b,c}
\end{document}
答案1
只是为了好玩,没有\foreach
和有一个更通用的宏。
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\matrixify}{O{b}mm}
{
\cs_set_protected:Nn \__jackirab_matrixify:n { #3 \\ }
\begin{#1matrix}
\clist_map_function:nN { #2 } \__jackirab_matrixify:n
\end{#1matrix}
}
\ExplSyntaxOff
\NewDocumentCommand{\fm}{m}{\matrixify{#1}{\textsc{##1}}}
\begin{document}
$\matrixify{a,b,c}{\textsc{#1}}$
$\fm{a,b,c}$
$\matrixify[p]{a,b,c}{(#1)}$
\end{document}
尾随参数\matrixify
是一个模板,其中#1
代表当前项目。
可选参数可以为空、、p
(b
默认)、或B
,以按照通常惯例产生相应的栅栏。v
V
amsmath
您可以根据 来定义命令\matrixify
,就像我所做的那样\fm
;请记住,在这种情况下,当前项目必须用 来表示##1
。
答案2
使用标记列表来执行此操作。OP 方法的问题在于,所需的标记是在循环的组恶作剧中“排版”的\foreach
。这样,只需保存所需的标记(以在循环之外保留的方式\foreach
),然后再排版它们。
\documentclass[10pt]{article}
\usepackage[margin = .5in]{geometry}
\usepackage[T1]{fontenc}
\usepackage{mathtools}
\usepackage{stmaryrd}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{xstring}
\newtoks\mytoks
\newcommand\addtotoks[1]{\global\mytoks\expandafter{\the\mytoks#1}}
\newcommand\xaddtotoks[1]{\expandafter\addtotoks\expandafter{#1}}
\newcommand{\smallcapsify}[1]{\mytoks{}%
\foreach \x in {#1}{\xaddtotoks{\expandafter\textsc\expandafter{\x}\\}}%
\the\mytoks}
\newcommand{\fm}[1]{$
\left[
\begin{matrix}
\smallcapsify{#1}
\end{matrix}
\right] $}
\begin{document}
$\begin{pmatrix}a\\b\\c\end{pmatrix}$
$\begin{matrix}\smallcapsify{a,b,c}\end{matrix}$
\fm{a,b,c}
\end{document}
答案3
您可以使命令范围内的所有数学运算默认为小型大写字母:
\documentclass[10pt]{article}
\usepackage[margin = .5in]{geometry}
\usepackage[T1]{fontenc}
\usepackage{mathtools}
\usepackage{stmaryrd}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{xstring}
\DeclareMathAlphabet {\mathsc}{OT1}{cmr}{m}{sc}
\newcommand{\fm}[1]{$
\left[
\mathsc{\everymath\expandafter{\expandafter\fam\the\fam\relax}\begin{matrix}#1\end{matrix}}
\right]$}
\begin{document}
\fm{a,b,c,A,B,C}
\end{document}