自定义间距和 TikZ

自定义间距和 TikZ

使用 LuaLaTeX 解决方案调整文档中的间距,我遇到了一个问题,在 TikZ 环境中分号也会被替换:


梅威瑟:

\documentclass{scrbook}

\usepackage{tikz}
\usepackage{luacode}
\usepackage{etoolbox}
\newrobustcmd\dblpnct[1]{%
  \ifincsname\else
    \ifmmode\else
      \ifhmode
        \unskip
      \fi
      \nolinebreak\hspace{#1}%
    \fi
  \fi
}

\begin{luacode}
function dosub(s)
    s = string.gsub(s, ';', '\\dblpnct{1.08334em}:')
    return(s)
end
\end{luacode}

\makeatletter
\AtBeginDocument{%
    \luaexec{luatexbase.add_to_callback("process_input_buffer", dosub, "dosub")}%
    \ifpatchable*\NR@sanitize@labelname
    {\pretocmd\NR@sanitize@labelname{\let\dblpnct\@gobble}{}{\failed}}
    {}
}
\makeatother

\begin{document}

\begin{tikzpicture}
\node{test};
\end{tikzpicture}

\end{document}

答案1

问题在于所选方法的局限性。在处理输入缓冲区时,分号的上下文和含义不可用。例如,一行可能看起来像:

\tikz\node{abc; def};

第一个分号属于排版文本,但第二个分号用作语法字符。也许,一些很小的子集情况可以通过正则表达式捕获,但 TeX 的语言太强大(图灵完备),无法捕获所有情况。

一种解决方法是使用不同于语法分号的东西并将其替换为 Lua 函数中的分号,例如(示例的基础是问题的示例,但用分号代替冒号)。

句法分号写为SEMICOLON。经过处理后dosub变为;

\documentclass{scrbook}

\usepackage{tikz}
\usepackage{luacode}
\usepackage{etoolbox}
\newrobustcmd\dblpnct[1]{%
  \ifincsname\else
    \ifmmode\else
      \ifhmode
        \unskip
      \fi
      \nolinebreak\hspace{#1}%
    \fi
  \fi
}

\begin{luacode}
function dosub(s)
    s = string.gsub(s, ';', '\\dblpnct{1.08334em};')
    s = string.gsub(s, 'SEMICOLON', ';')
    return(s)
end
\end{luacode}

\makeatletter
\AtBeginDocument{%
    \luaexec{luatexbase.add_to_callback("process_input_buffer", dosub, "dosub")}
    \ifpatchable*\NR@sanitize@labelname
    {\pretocmd\NR@sanitize@labelname{\let\dblpnct\@gobble}{}{\failed}}
    {}
}
\makeatother

\begin{document}

\begin{tikzpicture}
\node{test}SEMICOLON
\end{tikzpicture}

\end{document}

相关内容