在字符串中用作分隔符的安全字符

在字符串中用作分隔符的安全字符

由于某些原因,我需要选择一个或两个字符来分隔 LaTeX3 字符串中的占位符,例如:

I like ``NAME`OF`FRUITS``

为了实现更安全的替换(因此将第一个和最后一个符号加倍以消除歧义)+易于阅读。

但找到一个好的角色并不容易:

  • 许多字符对于 LaTeX 和 babel 来说具有特殊含义,它们会重新定义许多字符,例如^_-;~#……@我宁愿避免使用它们,以避免 espace 噩梦。而且我并不了解所有软件包,但我确信一些流行的软件包可以重新定义其他字符。
  • 我认为非 ASCII 字符可能是一个问题,因为它们在不同的计算机上可能会有不同的解释。具体来说,我不知道这是否°是一个有效的选择。

是否有一个基本上和字母一样安全的字符列表?

编辑

以下是我想考虑的一个更具体的用例。我基本上想确保无论周围有什么\robExtGetPlaceholder{__VEGETABLE__}_都不应将其转换为另一个符号,即使在加载了流行的包之后也是如此。

\documentclass{article}
\ExplSyntaxOn

\seq_clear_new:N \l_robExt_placeholders_seq 

% Make sure that the placeholder is in the list \l_robExt_placeholders_seq.
% This should automatically be called by other tools
\NewDocumentCommand{\robExtAddPlaceholderToList}{m}{
  \seq_put_left:Nn \l_robExt_placeholders_seq { #1 }
}

\NewDocumentCommand{\robExtPlaceholderFromContent}{mm}{
  \str_gset:cn { l_robExt_placeholder_#1_str } {#2}
  \message{aaaaaaaaaaaaa#1}
  \robExtAddPlaceholderToList{#1}
}

\NewDocumentCommand{\robExtDebugPlaceholder}{sm}{
  \message{Placeholder ~ #2 ~ contains: ~ \use:c{l_robExt_placeholder_#2_str}}
  \IfBooleanTF{#1}{\cs_show:c { l_robExt_placeholder_#2_str }}{}
}

\NewDocumentCommand{\robExtGetPlaceholder}{m}{
  \use:c{l_robExt_placeholder_#1_str}
}

\NewDocumentCommand{\robExtDebugPlaceholdersContents}{s}{
  \message{List ~ of ~ placeholders:}
  \seq_map_inline:Nn \l_robExt_placeholders_seq {\robExtDebugPlaceholder{##1}}
  \IfBooleanTF{#1}{\cs_show:N \l_robExt_placeholders_seq}{}
}

%% I also have other commands, for instance to replace placeholders etc...

\ExplSyntaxOff
\begin{document}

\robExtPlaceholderFromContent{__FRUIT__}{Orange}
\robExtPlaceholderFromContent{__SENTENCE__}{I like __FRUIT__ and __VEGETABLE__}

$\robExtPlaceholderFromContent{__VEGETABLE__}{Salad}$

\robExtDebugPlaceholdersContents*

Does it mean that whatever think is put around the get placeholder here, it will still be interpreted correctly? (no escape, no weird replacement of the character with another character…)

$1 + \robExtGetPlaceholder{__FRUIT__} + \robExtGetPlaceholder{__VEGETABLE__}$

\end{document}

答案1

一般来说,答案是

没有安全字符。

一个更有帮助的答案是

只有您能说出哪些是安全的字符(序列)。您可以使用任何保证不会作为数据出现的序列。

你的问题中的要点似乎不太相关,babel、输入编码等(大多数)只有在你排版时才重要,但在这里你只是在分隔子字符串。

您可能认为°是度数符号,但对于 pdftex 来说,它是两个字符标记 C2 B0,如果两个字节 C2 B0 永远不会出现在分隔字符串中,则将其用作分隔符是安全的。如果您将其翻倍,则分隔符是四个标记 C2 B0 C2 B0,答案是相同的,只要四个字节 C2 B0 C2 B0 不会出现在要分隔的数据中,就可以安全地将其用作分隔符。

更高级别的人物也是如此

答案2

编辑

事实证明,我错误地认为某些可通过 Alt 键访问的字符是 ASCII。虽然此解决方法“有效”,但它可能会带来大量未见的问题。感谢 David Carlise 的澄清。

原始答案

出于好奇,我测试了经典 ASCII字符可以推到多远,以用作函数或潜在的转义字符,正如你所需要的,结果证明它们可以运行!至少在这个例子中,你可以看到一些可能接近你的需求的东西:

\documentclass{article}

\newcount\newcase
\newcase=0
\def♪{%
  \ifnum\newcase=0
    \newcase=1
    \[
  \else
    \newcase=0
    \]
  \fi
}

\begin{document}
Musical math: ♪1+1=2♪
\end{document}

至少,在 UTF-8 编码下运行时,这在 LaTeX 上是有效的。但有一个警告:一次只能定义一个“特殊字符”,例如,执行以下操作:

\def♪{A thing}
\def♫{Another thing}

会导致“� 的使用不符合其定义”错误。我不太清楚原因,但至少这似乎对一个“奇怪”的定义有效。在这个“奇怪”的定义中,你可以随意使用 ☺☻♪♫←↓→↑§ 等字符!

希望有帮助!

相关内容