![使用特殊 Unicode 字符进行去标记化的替代方法](https://linux22.com/image/394406/%E4%BD%BF%E7%94%A8%E7%89%B9%E6%AE%8A%20Unicode%20%E5%AD%97%E7%AC%A6%E8%BF%9B%E8%A1%8C%E5%8E%BB%E6%A0%87%E8%AE%B0%E5%8C%96%E7%9A%84%E6%9B%BF%E4%BB%A3%E6%96%B9%E6%B3%95.png)
我已经使用定义了新命令\NewDocumentCommand
表示图中节点的描述。它包含姓名(作为参数提供),一些文本描述(作为参数提供)和链接到其他节点(以分号分隔的列表指定姓名s 在论点中)。从回答到这问题,我发现了\detokenize
命令,它允许我正确显示节点姓名s 包含下划线。(我也在\paragraph
names、\label
names 和\ref
erences 中使用它。)
问题是,当我\detokenize
在文本描述中使用时,一些 Unicode 字符会被替换为错误的字符。(例如,softvér
被替换为softvŠr
。)有没有其他的替代方法\detokenize
?我只需要自动转义某些描述中存在的<
和。我可以使用和,但我必须使用名称(这样引用才能起作用,我无法正确转义它,因为它是宏的参数),所以我希望具有一定的一致性并提供>
\textless
textgreater
detokenize
描述未逃脱。
编辑 这里有一个小例子:
\documentclass[12pt, oneside]{book}
\usepackage[a4paper,top=2.5cm,bottom=2.5cm,left=3.5cm,right=2cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[IL2]{fontenc}
\usepackage[hidelinks,breaklinks]{hyperref}
\usepackage[slovak]{babel}
\usepackage{nameref}
\usepackage{xparse}
\usepackage{ifthen}
\linespread{1.25}
\NewDocumentCommand\mynode{mm>{\SplitList{;}}m>{\SplitList{;}}m}
{
\paragraph[\detokenize{#1}]{\detokenize{#2} (\texttt{\detokenize{#1}}):}
\label{\detokenize{#1}}
\begin{itemize}
\item vstupné hrany:
\ProcessList{#3}{ \insertdep }
\item výstupné hrany:
\ProcessList{#4}{ \insertdep }
\end{itemize}
}
\newcommand{\insertdep}[1]{
\ifthenelse{\equal{}{#1}}{\texttt{-}}{\texttt{\nameref{\detokenize{#1}}};}
}
\begin{document}
\mynode{root}{Koreň}{root}{gui}
\mynode{gui}{Grafické rozhranie}{root}{nice_gui;fancy_gui}
\mynode{nice_gui}{Pekné grafické rozhranie}{gui}{}
\mynode{fancy_gui}{This text contains less and greater characters:<>}{gui}{}
\end{document}
\detokenize{#2}
破坏了特殊的斯洛伐克字符(与仅使用相比#2
)。我注意到,它甚至没有修复问题_<>
。我注意到,当我使用\verb|#2|
而不是 时\detokenize{#2}
,斯洛伐克字符和工作,但它显然改变了格式,并且由于某种原因在文本末尾<>
添加了下划线,并且下划线仍然使乳胶插入数学模式并制作下标。|
我正在用来pdflatex
编译。
答案1
它比使用 稍微复杂一些\detokenize
,尤其是使用IL2
。顺便问一下,你真的需要它吗?
这是一种预处理输入以便转换_<>
为适当命令的方法。
\documentclass[12pt, oneside]{book}
\usepackage[a4paper,top=2.5cm,bottom=2.5cm,left=3.5cm,right=2cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[IL2]{fontenc}
\usepackage[slovak]{babel}
\usepackage{nameref}
\usepackage{xparse}
\usepackage[hidelinks,breaklinks]{hyperref}
\ExplSyntaxOn
\NewDocumentCommand\mynode{mmmm}
{
\mynode_main:nnnn { #1 } { #2 } { #3 } { #4 }
}
\seq_new:N \l_mynode_input_seq
\seq_new:N \l_mynode_output_seq
\tl_new:N \l_mynode_node_tl
\tl_new:N \l_mynode_text_tl
\cs_new_protected:Nn \mynode_main:nnnn
{
\seq_set_split:Nnn \l_mynode_input_seq { ; } { #3 }
\seq_set_split:Nnn \l_mynode_output_seq { ; } { #4 }
\tl_set:Nn \l_mynode_node_tl { #1 }
\mynode_replace:N \l_mynode_node_tl
\tl_set:Nn \l_mynode_text_tl { #2 }
\mynode_replace:N \l_mynode_text_tl
\mynode_paragraph:VV \l_mynode_node_tl \l_mynode_text_tl
\label{ \tl_to_str:n { #1 } }
\begin{itemize}
\item vstupné~hrany:~
\seq_map_variable:NNn \l_mynode_input_seq \l_mynode_node_tl
{
\mynode_print:N \l_mynode_node_tl
}
\item výstupné~hrany:~
\seq_map_variable:NNn \l_mynode_output_seq \l_mynode_node_tl
{
\mynode_print:N \l_mynode_node_tl
}
\end{itemize}
}
\cs_new_protected:Nn \mynode_paragraph:nn
{
\paragraph[#1]{#2~(\texttt{#1}):}
}
\cs_generate_variant:Nn \mynode_paragraph:nn { VV }
\cs_new_protected:Nn \mynode_print:N
{
\texttt
{
\tl_if_empty:NTF #1
{ - }
{ \nameref { \tl_to_str:N #1 } }
};~
}
\cs_new_protected:Nn \mynode_replace:N
{
\regex_replace_all:nnN { \_ } { \c{_} } #1
\regex_replace_all:nnN { \< } { \c{textless} } #1
\regex_replace_all:nnN { \> } { \c{textgreater} } #1
}
\NewDocumentCommand{\change}{m}
{
\tl_set:Nn \l_mynode_text_tl { #1 }
\mynode_replace:N \l_mynode_text_tl
\tl_use:N \l_mynode_text_tl
%\tl_analysis_show:N #1 %%% for debugging
}
\ExplSyntaxOff
\begin{document}
\mynode{root}{Koreň}{root}{gui}
\mynode{gui}{Grafické rozhranie}{root}{nice_gui;fancy_gui}
\mynode{nice_gui}{Pekné grafické rozhranie}{gui}{}
\mynode{fancy_gui}{This text contains less and greater characters:<>}{gui}{}
\mynode{<test>}{Some text with \texttt{under_score}}{<test>}{}
\end{document}
答案2
实际上,你有两个不同的问题:字体编码和一个文本编码。遗憾的是,我只能帮助您解决第二个问题。
\detokenize
不是 UTF8 友好的,但有时你可以用以下命令替换它:
\newcommand{\utffriendlydetokenize}[1]{%
\scantokens{%
\catcode`\_=12%
\catcode`\^=12%
\catcode`\{=12%
\catcode`\}=12%
\catcode`\&=12%
\catcode`\$=12%
\catcode`\#=12%
\catcode`\~=12%
\catcode`\\=12%
#1%
}%
}
(来源:https://gitlab.com/Nickkolok/biblatex2bibitem/-/blob/master/biblatex2bibitem.sty)
就您而言,唯一需要更改的行是:
\paragraph[\detokenize{#1}]{\utffriendlydetokenize{#2} (\texttt{\detokenize{#1}}):}
但是,它不能修复 的问题<>_
,因为该问题是由 中指定的符号的代码引起的fontenc
。(另请参阅\detokenize 和下划线的奇怪行为) 唯一能想到的附加解决方案是_<>
通过使用它们的catcode
s 来重新定义为活动角色,将它们映射到相应的命令并纠正\utffriendlydetokenize
所选catcode
s 的定义。