expl3:将 tikz 节点内的标记列表小写

expl3:将 tikz 节点内的标记列表小写

这个问题要求回答expl3:将标记列表小写由 Joseph Wright 提供

我想将由字母、数字和控制序列组成的标记列表转换为小写\\。Joseph Wright 使用的方法(使之变得健壮\\)在普通文本中运行良好,但在节点内部使用时会因编译错误而失败TikZ

\documentclass{article}

\usepackage{xparse}
\usepackage{tikz}

\ExplSyntaxOn
\NewDocumentCommand \LowerCase { m }
  {
    \group_begin:
      \cs_set_protected:Npx \\ { \exp_not:o \\ }
      \tl_lower_case:n {#1}
    \group_end:
  }

\tl_new:N \g_metadata_title_tl

\NewDocumentCommand \mytext {m}
  {
    \tl_gset:Nn \g_metadata_title_tl {#1}
  }

\NewDocumentCommand \thetext {}
  {
    \tl_use:N \g_metadata_title_tl
  }

\ExplSyntaxOff


\begin{document}
\mytext{This is my\\ Text}

\noindent\LowerCase{\thetext}

\begin{tikzpicture}[overlay, remember picture]
  \node[align=left] (text1) {\thetext};

  \node[align=left, below of = text1] (text2) {\LowerCase{\thetext}};
\end{tikzpicture}

\end{document}

注意:小写的文本应取自标记列表变量。

答案1

这里的问题是,\begingroup ... \endgroup如果节点是对齐的,你就不能绕过节点的内容:这可以通过一个简单的例子来说明

\documentclass{article}

\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
  \node[align=left] {\begingroup Hello\\World\endgroup};
\end{tikzpicture}
\end{document}

因此我们需要保存并恢复 without a group 的含义\\。假设不需要嵌套:

\documentclass{article}

\usepackage{xparse}
\usepackage{tikz}

\ExplSyntaxOn
\NewDocumentCommand \LowerCase { m }
  {
    \cs_set_eq:NN \__texnik_newline: \\
    \cs_set_protected:Npx \\ { \exp_not:o \\ }
    \tl_lower_case:n {#1}
    \cs_set_eq:NN \\ \__texnik_newline:
  }

\tl_new:N \g_metadata_title_tl

\NewDocumentCommand \mytext {m}
  {
    \tl_gset:Nn \g_metadata_title_tl {#1}
  }

\DeclareExpandableDocumentCommand \thetext {}
  {
    \tl_use:N \g_metadata_title_tl
  }

\ExplSyntaxOff


\begin{document}
\mytext{This is my\\ Text}

\noindent\LowerCase{\thetext}

\begin{tikzpicture}[overlay, remember picture]
  \node[align=left] (text1) {\thetext};

  \node[align=left, below of = text1] (text2) {\LowerCase{\thetext}};
\end{tikzpicture}

\end{document}

相关内容