![在字符串中用作分隔符的安全字符](https://linux22.com/image/466778/%E5%9C%A8%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%94%A8%E4%BD%9C%E5%88%86%E9%9A%94%E7%AC%A6%E7%9A%84%E5%AE%89%E5%85%A8%E5%AD%97%E7%AC%A6.png)
由于某些原因,我需要选择一个或两个字符来分隔 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}
会导致“� 的使用不符合其定义”错误。我不太清楚原因,但至少这似乎对一个“奇怪”的定义有效。在这个“奇怪”的定义中,你可以随意使用 ☺☻♪♫←↓→↑§ 等字符!
希望有帮助!