![pdflatex 中的自动直立下标](https://linux22.com/image/456097/pdflatex%20%E4%B8%AD%E7%9A%84%E8%87%AA%E5%8A%A8%E7%9B%B4%E7%AB%8B%E4%B8%8B%E6%A0%87.png)
有一段时间我使用米科斯解决方案问题基于 lualatex 自动排版下标。现在我想切换回 pdflatex(因为编译时间和更好的 preformat/mylatexformat 支持)但保留此解决方案提供的语法。
在此这答案@Svend Tveskæg 展示了一个也适用于 pdflatex 的解决方案,但语法略有不同。现在我想修改这个解决方案,使其像 Micos 解决方案一样运行,但适用于 pdflatex。
特别是,它应该使用{
和}
作为分隔符(而不是|
),并且如果我留下像这样的间隙,它还会切换回斜体$v_ {x,\max}$
。
我尝试像这样替换@Svend Tveskæg 中的分隔符,但是不起作用:
\documentclass{article}
\makeatletter
\begingroup
\catcode`\_=\active
\protected\gdef_{\@ifnextchar{\subtextup\sb}
\endgroup
\def\subtextup\catcode{#1}{\sb{\textnormal{#1}}}
\AtBeginDocument{\catcode`\_=12 \mathcode`\_=32768}
\makeatother
\begin{document}
$A_1 A_p A_{p} A_ {p} $
\end{document}
错误信息:
This is pdfTeX, Version 3.141592653-2.6-1.40.23 (TeX Live 2021) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
(./Upright.tex
LaTeX2e <2021-11-15> patch level 1
L3 programming layer <2022-02-21>
(/usr/local/texlive/2021/texmf-dist/tex/latex/base/article.cls
Document Class: article 2021/10/04 v1.4n Standard LaTeX document class
(/usr/local/texlive/2021/texmf-dist/tex/latex/base/size10.clo))
! Illegal parameter number in definition of _.
<to be read again>
1
l.8 \def\subtextup\catcode{#1
}{\sb{\textnormal{#1}}}
以下是我目前使用过的内容:
% Automatically upright subscripts with lualatex
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{uprightsub}
[2021/09/06 v1.0 upright math via lualatex]
\RequirePackage{amsmath,luacode}
%%See https://tex.stackexchange.com/questions/156641/typeset-subscript-material-automatically-in-upright-font-shape
\begin{luacode}
function up_subs ( buff )
return ( string.gsub ( buff , "_(%b{})" , "_{\\textnormal%1}" ) )
end
\end{luacode}
\AtBeginDocument{\directlua{luatexbase.add_to_callback(
"process_input_buffer", up_subs, "up_subs")}}
\endinput
%%
%% End of file `uprightsub.sty'.
如果有另一个 pdflatex 解决方案能够显示出所需的行为,那么我们也会欢迎。
编辑
如果我编译使用像这样的 lualatex 解决方案
\documentclass{article}
\usepackage{uprightsub}
\begin{document}
$A_1 A_p A_{p} A_ {p} $
\end{document}
输出为
这将是此示例所需的输出。
答案1
如果您不了解 TeX,那么尝试修改 TeX 代码将会很困难。
无论如何,只需这样做(使用nospace
版本来“尊重”空间)
%! TEX program = pdflatex
\documentclass{article}
\usepackage{amsmath}
\usepackage{ltxcmds}
\makeatletter
\begingroup
\catcode`\_=\active
\protected\gdef_{\ltx@ifnextchar@nospace\bgroup\subtextup\sb}
\endgroup
\def\subtextup#1{\sb{\textnormal{#1}}}
\AtBeginDocument{\catcode`\_=12 \mathcode`\_=32768}
\makeatother
\begin{document}
$A_1 A_p A_{p} A_ {p} $
\end{document}