这可能是 LyX 而不是 LaTeX 的东西,但还是要说一下。
我有一段代码,其中有一个宏(\TE
),宏内还有一个宏(\PTV
)
$\left(\PTV[\TE[i]]\right)$
正如它应该,这会失败并显示错误“ Argument of \\TE has an extra }
”。我发现我可以通过在该\TE[i]
部分周围插入一对花括号来修复该问题,以便
\left(\PTV[{\TE[i]}]\right)
它工作得很好,直到我保存、关闭并重新开放该文件。
我发现 LyX 在打开时会在加载到内存中时删除括号(根据“查看源代码”窗格)。我阅读了一些有关该\protect
命令的内容,但无法让它工作。考虑到文档会使用所需的代码保存(只是重新打开时才有问题),我也不完全相信这是一个保护问题。
有人知道发生了什么吗?或者如何强制 LyX 在读取文档时保留括号?或者也许有解决方法?
编辑:根据要求,\TE
定义:
\newcommandx\TE[1][usedefault, addprefix=\global, 1=]{\gamma_{#1}}
并且\PTV
定义:
\newcommandx\PTV[1][usedefault, addprefix=\global, 1=]{\boldsymbol{\tau}_{#1}}
EDIT2:错误#10562 已提交至https://www.lyx.org/trac/ticket/10562。错误报告包括一个 lyx 文件,它是该错误的一个最小可重现示例。
EDIT3:我想我现在可以明确地说这是 Lyx 的一个错误。考虑以下代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xargs}
\begin{document}
\newcommandx\TE[1][usedefault, addprefix=\global, 1=]{\gamma_{#1}}
\newcommandx\PTV[1][usedefault, addprefix=\global, 1=]{\boldsymbol{\tau}_{#1}}
$(\PTV[{\TE[i]}])$
\end{document}
使用 TexMaker 中的 pdflatex 进行编译,编译得很好。将其导入 Lyx,就会出现我所说的问题。我还注意到,通过移动宏可以解决 Lyx 中的编译问题,但 Lyx 不再识别宏(因此破坏了 Lyx 的一个功能)。即:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xargs}
\newcommandx\TE[1][usedefault, addprefix=\global, 1=]{\gamma_{#1}}
\newcommandx\PTV[1][usedefault, addprefix=\global, 1=]{\boldsymbol{\tau}_{#1}}
\begin{document}
$(\PTV[{\TE[i]}])$
\end{document}
仍不清楚为什么但这确实发生了……
答案1
在参数内部,花括号必须正确嵌套,不允许单独使用没有配对的花括号。但是,这种对花括号的特殊处理不适用于方括号,它们只是 TeX 的普通标记。用作可选参数只是 LaTeX 的惯例。
当 TeX 解析可选参数 `\PIV' 时:
\PTV[\TE[i]]
它寻找第一的可用的结束括号。它不知道\TE
并使用其可选参数的结束括号。的可选参数\PTV
是:
\TE[i
这破坏了 的语法\TE
。
花括号可以防止这种情况发生:
\PVI[{\TE[i]}]
因为花括号必须在参数内匹配,所以 TeX 不能采用花括号内的第一个右方括号,而是使用下一个右方括号,而这恰好是预期的方括号。
LaTeX3模块xparse
提供了更复杂的可选参数解析。在某种程度上,它模拟了花括号的特殊处理,即必须将它们正确嵌套在方括号中。以下示例显示,现在可以省略花括号。名称以 结尾的宏a
以传统方式定义,名称以 结尾的宏b
通过 定义xparse
:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xargs}
\newcommandx\TEa[1][usedefault, addprefix=\global, 1=]{%
\gamma\ifx\\#1\\\else_{#1}\fi
}
\newcommandx\PTVa[1][usedefault, addprefix=\global, 1=]{%
\boldsymbol{\tau}\ifx\\#1\\\else_{#1}\fi
}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\TEb}{o}
{
\gamma
\IfValueT{#1}{\sb{#1}}
}
\NewDocumentCommand{\PTVb}{o}
{
\boldsymbol{\tau}
\IfValueT{#1}{\sb{#1}}
}
\ExplSyntaxOff
\begin{document}
$(\PTVa[{\TEa[i]}])$
$(\PTVb[{\TEb[i]}])$
\end{document}
评论:
- 我添加了一个简单的测试,如果下标为空则抑制下标。
\sb
代替_
,因为 的下划线是普通字母\ExplSyntaxOn
。这样它就可以很容易地在宏名中使用,但在数学模式下没有下标含义。
答案2
Lyx 开发团队已确认这是一个错误。已开发修复程序并将包含在版本 2.2.3 中。