我有一个无法自己解决的 LaTeX 问题。我有一个重复的字符排列,我想在 LaTeX 中自动格式化它们。
1H-NMR (400 MHz; DMSO-d6): \textdelta 12.41 (s, OH), 7.36-7.30 (m,
Cbz), 7.20 (t, J = 5.5 Hz, NH), 5.00 (s, Cbz-CH2), 3.48 (q, J = 13.4
Hz, N-CH2), 3.33 (t, J = 7.3 Hz, N-CH), 2.96 (q, J = 6.2 Hz, NH-CH2),
1.57 (td, J = 16.8, 9.0 Hz, CH2), 1.40 (d, J = 3.4 Hz, CH2), 1.30-1.24 (m, CH2).
现在我必须将所有内容改为J
斜体*J*
。当然我可以手动完成所有这些操作,但我有相当多的数据集,自动化将非常有帮助。我想到了一个将所有 J 改为斜体的新环境J。有可能吗?我可以用 if-then 命令检查吗?喜欢if="character"=J then italic else normal
我希望你能帮助我解决这个问题。
更新:
感谢大家的帮助。我尝试理解你们的所有建议,发现它们对于一个数据集都适用。现在我尝试定义一个新环境,可以在工作中将其用于多个数据集。
\documentclass{article}
\begin{document}
\newenvironment{NMR2}
{
\def\dataset{
}
{
}
\xpatchcmd*{\dataset}{J}{\emph{J}}{}{} % making problems
\dataset
}
\begin{NMR2}
1H-NMR (400 MHz; DMSO-d6): 12.41 (s, OH), 7.36-7.30 (m,
Cbz), 7.20 (t, J = 5.5 Hz, NH), 5.00 (s, Cbz-CH2), 3.48 (q, J = 13.4
Hz, N-CH2), 3.33 (t, J = 7.3 Hz, N-CH), 2.96 (q, J = 6.2 Hz, NH-CH2),
1.57 (td, J = 16.8, 9.0 Hz, CH2), 1.40 (d, J = 3.4 Hz, CH2), 1.30-1.24 (m, CH2).
\end{NMR2}
\end{document}
我对第二个想法也做了同样的尝试:
\documentclass{article}
\begin{document}
\newenvironment{NMR}
{
\def\oldJ{J} % \oldJ contains "J"
\let\J=\oldJ % \J contains "J"
\catcode`\J=13 % makes J an active character
\defJ{\textit{\J}} % makes J italic
}
{
\catcode`\J=11 % makes J from an active character to a letter again
}
\begin{NMR}
1H-NMR (400 MHz; DMSO-d6): 12.41 (s, OH), 7.36-7.30 (m,
Cbz), 7.20 (t, J = 5.5 Hz, NH), 5.00 (s, Cbz-CH2), 3.48 (q, J = 13.4
Hz, N-CH2), 3.33 (t, J = 7.3 Hz, N-CH), 2.96 (q, J = 6.2 Hz, NH-CH2),
1.57 (td, J = 16.8, 9.0 Hz, CH2), 1.40 (d, J = 3.4 Hz, CH2), 1.30-1.24 (m, CH2).
\end{NMR}
\end{document}
这两个示例都存在问题,并且不起作用。我做错了什么?
答案1
您无法像编辑中建议的那样定义环境。但是,您可以吸收环境的内容,然后进行替换。
我可以提出三种方法,均基于该environ
包。
方法 1(使用regexpatch
)
该environ
包的定义NMR2
方式是,环境的内容存储在 中\BODY
;然后我们可以使用\xpatchcmd*
将所有出现的 替换J
为\textit{J}
。
\documentclass{article}
\usepackage{regexpatch,environ}
\NewEnviron{NMR2}{%
\xpatchcmd*\BODY{J}{\textit{J}}{}{}%
\BODY}
\begin{document}
\begin{NMR2}
1H-NMR (400 MHz; DMSO-d6): 12.41 (s, OH), 7.36-7.30 (m,
Cbz), 7.20 (t, J = 5.5 Hz, NH), 5.00 (s, Cbz-CH2), 3.48 (q, J = 13.4
Hz, N-CH2), 3.33 (t, J = 7.3 Hz, N-CH), 2.96 (q, J = 6.2 Hz, NH-CH2),
1.57 (td, J = 16.8, 9.0 Hz, CH2), 1.40 (d, J = 3.4 Hz, CH2), 1.30-1.24 (m, CH2).
\end{NMR2}
\end{document}
方法 2(使用l3regex
)
由于regexpatch
基于l3regex
,因此可以直接使用正则表达式模块。
\documentclass{article}
\usepackage{l3regex,environ}
\ExplSyntaxOn
\NewEnviron{NMR2}
{
\regex_replace_all:nnN { J } { \c{textit}\cB\{ J \cE\} } \BODY
\BODY
}
\ExplSyntaxOff
\begin{document}
\begin{NMR2}
1H-NMR (400 MHz; DMSO-d6): 12.41 (s, OH), 7.36-7.30 (m,
Cbz), 7.20 (t, J = 5.5 Hz, NH), 5.00 (s, Cbz-CH2), 3.48 (q, J = 13.4
Hz, N-CH2), 3.33 (t, J = 7.3 Hz, N-CH), 2.96 (q, J = 6.2 Hz, NH-CH2),
1.57 (td, J = 16.8, 9.0 Hz, CH2), 1.40 (d, J = 3.4 Hz, CH2), 1.30-1.24 (m, CH2).
\end{NMR2}
\end{document}
方法 3(使用\scantokens
)
\documentclass{article}
\usepackage{environ}
\NewEnviron{NMR2}{%
\begingroup\lccode`\~=`\J
\lowercase{\endgroup\def~}{\textit{J}}%
\catcode`\J=\active\scantokens\expandafter{\BODY\relax}}
\begin{document}
\begin{NMR2}
1H-NMR (400 MHz; DMSO-d6): 12.41 (s, OH), 7.36-7.30 (m,
Cbz), 7.20 (t, J = 5.5 Hz, NH), 5.00 (s, Cbz-CH2), 3.48 (q, J = 13.4
Hz, N-CH2), 3.33 (t, J = 7.3 Hz, N-CH), 2.96 (q, J = 6.2 Hz, NH-CH2),
1.57 (td, J = 16.8, 9.0 Hz, CH2), 1.40 (d, J = 3.4 Hz, CH2), 1.30-1.24 (m, CH2).
\end{NMR2}
\end{document}
所有三种方法的输出
答案2
(根据我的定义\textdelta
):
\documentclass{article}
\begin{document}
\def\textdelta{\mbox{$\delta$}}
\def\oldJ{J}
\let\J=\oldJ
\catcode`\J=13
\defJ{\textit{\J}}
1H-NMR (400 MHz; DMSO-d6): \textdelta 12.41 (s, OH), 7.36-7.30 (m,
Cbz), 7.20 (t, J = 5.5 Hz, NH), 5.00 (s, Cbz-CH2), 3.48 (q, J = 13.4
Hz, N-CH2), 3.33 (t, J = 7.3 Hz, N-CH), 2.96 (q, J = 6.2 Hz, NH-CH2),
1.57 (td, J = 16.8, 9.0 Hz, CH2), 1.40 (d, J = 3.4 Hz, CH2), 1.30-1.24 (m, CH2).
\catcode`\J=11 % an attempt to final cleaning
\end{document}
警告:如果加载了额外的包,可能会产生副作用。