\documentclass{novel}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N
\l_xym_rtext_tl
%------------------
\cs_set:Npn \xym_funcredacta:n #1 {
\regex_replace_all:nnN
{ ([A-Za-z]){1} }
{
\c{redact}
}
\l_xym_rtext_tl
}
%------------------
\cs_set:Npn \xym_funcredactb:n #1 {
\regex_replace_all:nnN
{ (\w){1} }
{
\c{redact}
}
\l_xym_rtext_tl
}
%------------------
\cs_set:Npn \xym_funcredactc:n #1 {
\regex_replace_all:nnN
{ (\S){1} }
{
\c{redact}
}
\l_xym_rtext_tl
}
%------------------
\cs_set:Npn \xym_funcredactd:n #1 {
\regex_replace_all:nnN
{ ([\S\s]){1} }
{
\c{redact}
}
\l_xym_rtext_tl
}
\NewDocumentCommand { \redact } { } {
\rule{1.1em}{2ex}
{\hyphenchar\font=32 -}
}
\NewDocumentCommand { \redacttexta } { m } {
\tl_set:Nx
\l_xym_rtext_tl
{ #1 }
\tl_map_function:NN
\l_xym_rtext_tl
\xym_funcredacta:n
\tl_use:N
\l_xym_rtext_tl
}
\NewDocumentCommand { \redacttextb } { m } {
\tl_set:Nx
\l_xym_rtext_tl
{ #1 }
\tl_map_function:NN
\l_xym_rtext_tl
\xym_funcredactb:n
\tl_use:N
\l_xym_rtext_tl
}
\NewDocumentCommand { \redacttextc } { m } {
\tl_set:Nx
\l_xym_rtext_tl
{ #1 }
\tl_map_function:NN
\l_xym_rtext_tl
\xym_funcredactc:n
\tl_use:N
\l_xym_rtext_tl
}
\NewDocumentCommand { \redacttextd } { m } {
\tl_set:Nx
\l_xym_rtext_tl
{ #1 }
\tl_map_function:NN
\l_xym_rtext_tl
\xym_funcredactd:n
\tl_use:N
\l_xym_rtext_tl
}
\ExplSyntaxOff
\newcommand\sampletext{[``qwerty'' uiop; asdf: ghjkl, zxcv? bnm. $1,234.56 <>/ = 42 àáâãäåæ]}
\begin{document}
Sample text = \sampletext
There are degrees of redaction.
--- \texttt{\textbackslash redacttexta} hides (unaccented) letters:
text text text
\redacttexta{\sampletext}
text text text
--- \texttt{\textbackslash redacttextb} hides (unaccented) letters and digits:
text text text
\redacttextb{\sampletext}
text text text
--- \texttt{\textbackslash redacttextc} hides anything that is not a space:
text text text
\redacttextc{\sampletext}
text text text
--- \texttt{\textbackslash redacttextd} hides everything:
text text text
\redacttextd{\sampletext}
text text text
\end{document}
\redact):\documentclass{novel}\newcommand{\redact}{\rule{1.1em}{2ex}}\begin{document}x x x █ █ █ \redact \redact \redact \end{document}. Adjust the height and width as appropriate. If you need multi-lines, add\-discretionary hyphen to the definition of the macro:\newcommand{\redact}{\rule{1.1em}{2ex}\-}. – Cicada Sep 11 '22 at 07:38\newcommand{\redact}[1]{\rule[-0.5ex]{\widthof{#1}}{2.5ex}}, which when used with\redact{words to redact}would produce a solid black bar the exact width of "words to redact". (Requires calc package.) – frabjous Sep 11 '22 at 11:35censorpackage. – Cicada Sep 11 '22 at 14:44