![使用哈希表将字符串转换为一个字符](https://linux22.com/image/405859/%E4%BD%BF%E7%94%A8%E5%93%88%E5%B8%8C%E8%A1%A8%E5%B0%86%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6.png)
我有一份报告中提到了一些人。有时我想隐藏这些人的真实姓名。我想编写一个宏,将姓名转换为单个字符。
\name{John Doe}
hide
当布尔值为真时,应该打印 PersonA ,John Doe
否则打印。
我需要一些将名称转换为单个字符的宏,但文档中的每个名称都应转换为相同的字符。
答案1
我将每个名称存储在一个属性列表中,并附上一个用字母表示的动态计算的整数。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\name}{m}
{
\textnik_name:n { #1 }
}
\NewDocumentCommand{\hidenames}{}
{
\bool_gset_false:N \g_textnik_name_bool
}
\NewDocumentCommand{\shownames}{}
{
\bool_gset_true:N \g_textnik_name_bool
}
\prop_new:N \g_textnik_name_prop
\int_new:N \g_textnik_name_int
\bool_new:N \g_textnik_name_bool
\cs_new_protected:Nn \textnik_name:n
{
\prop_if_in:NnF \g_textnik_name_prop { #1 }
{
\int_gincr:N \g_textnik_name_int
\prop_gput:Nnx \g_textnik_name_prop { #1 } { \int_to_Alph:n { \g_textnik_name_int } }
}
\bool_if:NTF \g_textnik_name_bool
{
#1
}
{
Person\prop_item:Nn \g_textnik_name_prop { #1 }
}
}
\ExplSyntaxOff
\shownames
\begin{document}
Here we talk about \name{John Doe} and about
\name{Ööç Galaxy} and again about \name{John Doe}.
\hidenames
Here we talk about \name{John Doe} and about
\name{Ööç Galaxy} and again about \name{John Doe}.
\end{document}