我正在使用 fancyvrb 按照建议在我的 verbatim 环境中进行数学运算这里。
我使用如下数学转义命令:
\newcommand{\m}[1]{$#1$}
但是下划线没有被设置为下标,它们显示为下划线。
\begin{Verbatim}[commandchars=\\\{\}]
for \m{i = 1, 2, \dots n}:
sample \m{x_i} from \m{P(X_i \vert \mathrm{Parents}(X_i))}
return \m{(x_1, x_2, \dots, x_n)}
\end{Verbatim}
我如何使用符号来获得下标_
?我认为这与我的新命令的定义有关。
答案1
定义\m
缺少一点:
\makeatletter
\newcommand{\m][1]{\def\FV@Space{ }$#1$}
\makeatother
这样空格在数学中就被当作通常处理(即被忽略)。但我还要补充一点。您可以利用在逐字模式下下划线是可打印字符的事实:
\documentclass{article}
\usepackage{fancyvrb}
\makeatletter
\newcommand{\m}[1]{%
\begingroup
\def\FV@Space{ }% spaces in math are ignored
\mathcode`\_="8000 % _ is math active
\do@@us % underscore is subscript
$#1$%
\endgroup
}
\newcommand{\do@@us}{%
\begingroup\lccode`~=`\_ \lowercase{\endgroup\let~}\sb
}
\makeatother
\begin{document}
\begin{Verbatim}[commandchars=\\\{\}]
for \m{i = 1, 2, \dots n}:
sample \m{x_i} from \m{P(X_i \mid \mathrm{Parents}(X_i))}
return \m{(x_1, x_2, \dots, x_n)}
this_is_verb
\end{Verbatim}
\end{document}
答案2
另一种方法是在 Verbatim 环境中添加代码
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`$=3 \catcode`_=8}]
for \m{i=1,2,\dots,n}:
sample \m{x_i} from \m{P(X_i\vert\mathrm{Parents}(X_i))}
return \m{(x_1,x_2,\dots,x_n)}
\end{Verbatim}
答案3
如果可能是临时解决方案,则可行如下:
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\def\m#1{\global\catcode`\_=8$#1$}
\begin{Verbatim}[commandchars=\\\{\}]
for \m{i = 1, 2, \dots n}:
sample \m{x_i} from \m{P(X_i \vert \mathrm{Parents}(X_i))}
return \m{(x_1, x_2, \dots, x_n)}
\end{Verbatim}
\end{document}
限制:1. 目前无法_
在里面使用下划线Verbatim
。2. 数学模式中的间距仍然很奇怪。3. 未测试冲突。
第二版
但为什么必须选择呢?如果我们使用外部的定义Verbatim
并将结果注入其中,我们就会同时拥有:数学和逐字(仅替换了两种情况):
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\def\m#1{$#1$}
\def\AAA{ \m{i = 1, 2, \dots n}}
\def\BBB{\m{(x_1, x_2, \dots, x_n)}}
\begin{Verbatim}[commandchars=\\\{\}]
for \m{i = 1, 2, \dots n}:
\AAA
sample \m{x_i} from \m{P(X_i \vert \mathrm{Parents}(X_i))}
return \m{(x_1, x_2, \dots, x_n)}
\BBB
\end{Verbatim}
\end{document}