强制插入花括号

强制插入花括号

这可能是 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 中。

相关内容