如何在单个字母下添加下划线,并在下划线和字母之间留有空格?

如何在单个字母下添加下划线,并在下划线和字母之间留有空格?

我给学生提供密码/代码让他们解答。我想在每个字母下面添加下划线,下划线的位置要足够远,以便学生能够写出解码后的字母。

我曾对一个句子这样做过,但对所有密码/代码都这样做花费的时间太多了。有没有一种更简便的方法来完成单个字母的下划线,同时又留出空间来写新字母?

\documentclass[a4paper,landscape]{article}
\usepackage{soul}
\usepackage[letterspace=150]{microtype}

\begin{document} 


\setul{48pt}{2pt}% 5pt below contents

\lsstyle

{\fontsize{40}{100}\selectfont \ul{S}\hspace{0.1cm}\ul{l}\hspace{0.1cm}\ul{a}\hspace{0.1cm}'\ul{z}\hspace{0.8cm}\ul{h}\hspace{0.1cm}\ul{s}\hspace{0.1cm}\ul{z}\hspace{0.1cm}\ul{v}\hspace{0.8cm}\ul{l}\hspace{0.1cm}\ul{e}\hspace{0.1cm}\ul{w}\hspace{0.1cm}\ul{y}\hspace{0.1cm}\ul{l}\hspace{0.1cm}\ul{z}\hspace{0.1cm}\ul{z}\hspace{0.8cm}\ul{n}\hspace{0.1cm}\ul{y}\hspace{0.1cm}\ul{h}\hspace{0.1cm}\ul{a}\hspace{0.1cm}\ul{p}\hspace{0.1cm}\ul{a}\hspace{0.1cm}\ul{b}\hspace{0.1cm}\ul{k}\hspace{0.1cm}\ul{l}\hspace{0.8cm}\ul{a}\hspace{0.1cm}\ul{v}\hspace{0.8cm}\ul{a}\hspace{0.1cm}\ul{o}\hspace{0.1cm}\ul{l}\hspace{0.8cm}\ul{b}\hspace{0.1cm}\ul{u}\hspace{0.1cm}\ul{z}\hspace{0.1cm}\ul{b}}


\end{document}

在此处输入图片描述

答案1

我将输入拆分为空格,然后处理每个块。这种处理包括检查字符是否在特殊字符列表中(这里是撇号、逗号和句号),如果不在,则tabular排版;字母周围有一些水平空格。

每个字母后都加一个小空格。每个块之间都加一个空格。

通过局部设置 的高值,可实现行与行之间的相等距离\lineskip​​。使用 可定义块之间的更多空间\spaceskip

\documentclass{article}
\usepackage{lipsum}

\ExplSyntaxOn
\NewDocumentCommand{\decode}{m}
 {
  \group_begin:
  \par\addvspace{\topsep}
  \dim_set:Nn \parindent { 0pt }
  \dim_set:Nn \lineskip { 2.5ex }
  \skip_set:Nn \spaceskip { 2em plus 0.5em minus 1em }
  \large
  \paul_decode:n { #1 }
  \par\addvspace{\topsep}
  \group_end:
 }

\seq_new:N \l__paul_decode_input_seq

\cs_new_protected:Nn \paul_decode:n
 {
  % split the input at spaces
  \seq_set_split:Nnn \l__paul_decode_input_seq { ~ } { #1 }
  % process each fragment
  \seq_map_function:NN \l__paul_decode_input_seq \__paul_decode_word:n
 }

\cs_new_protected:Nn \__paul_decode_word:n
 {
  \tl_map_function:nN { #1 } \__paul_decode_item:n 
  \linebreak[0]\ %
 }

\cs_new_protected:Nn \__paul_decode_item:n
 {
  \peek_regex:nTF { [',\.] } % the special characters
   { \__paul_decode_symbol:n } % there is a special character
   { \__paul_decode_letter:n } % no special character
   #1 % the letter
 }

\cs_new_protected:Nn \__paul_decode_symbol:n
 {
  \,#1\,\nolinebreak\hspace{0.2em}
 }

\cs_new_protected:Nn \__paul_decode_letter:n
 { 
  \begin{tabular}[t]{@{}c@{}} \,#1\, \\ \rule{0pt}{2ex}\hrulefill \end{tabular}
  \nolinebreak\hspace{0.2em}
 }

\ExplSyntaxOff

\begin{document}

\lipsum[1][1-4]

\decode{Sla'z hszv lewylzz nyhapabkl, av aol buzb.}

\lipsum[2][1-4]

\end{document}

在此处输入图片描述

答案2

基于这个帖子它解释了如何循环字符串,我想说你正在寻找:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\markletters}{m}
 {
  % save the input in a variable
  \tl_set:Nn \l_kessels_unmarked_letters_tl { #1 }
  % replace spaces with \textvisiblespace
  \tl_replace_all:Nnn \l_kessels_unmarked_letters_tl { ~ } { \textvisiblespace }
  % map the input to underlined letters
  \tl_map_inline:Nn \l_kessels_unmarked_letters_tl { \hspace{0.1cm}\underline{##1} }
 }
\tl_new:N \l_kessels_unmarked_letters_tl
\ExplSyntaxOff

\begin{document}

\markletters{Hello World!}

\end{document}

并产生了这个:

在此处输入图片描述

评论:

  • 随意更改\hspace{0.1cm}。但是,如果没有任何空格,您只会在所有字母下方看到一条看似连在一起的线。
  • 可能有更优雅的方法可以在所有字母下产生同样大的线条。
  • \textvisiblespace你可以通过删除第 10 行来删除它

答案3

拥有expl3tikz

代码

\documentclass{article}
\usepackage{tikz}
%https://tex.stackexchange.com/questions/686480/how-to-add-underlines-under-individual-letters-with-space-between-underline-and
\parindent=0pt
\ExplSyntaxOn
\int_new:N \l_pos_int
\int_set:Nn \l_pos_int {0}
\dim_new:N \l_rule_dim

\NewDocumentCommand{\vertstr}{ O{0.4pt} m }
{
  % #1 height of rule
  % #2 the text
  \begin{tikzpicture}
  % store argument as string
  \str_set:Nn \l_tmpa_str {#2}
  % traverse the string
  \str_map_inline:Nn \l_tmpa_str {
      \str_if_eq:nnTF { ##1 } { ~ }%  if space --> height of rule 0pt
        {\dim_set:Nn \l_rule_dim {0pt}}
        {\dim_set:Nn \l_rule_dim {#1}}
      % center each character at their own line
      % we can chage the distance in [4pt] by for example [0pt]
      \node[mynode] at (0.4*\l_pos_int,0){\centering \strut##1 \\[4pt] \rule{1em}{\l_rule_dim}};%
      \int_incr:N \l_pos_int
  }
  \end{tikzpicture}
}

\ExplSyntaxOff
\begin{document}
\tikzset{
  mynode/.style={
      %draw=black, 
      minimum height=1cm,
      text width=1em,
      inner sep=0pt
    }
}


\vertstr{Sla'z hszv lewyzz nyhapabkl}

\vertstr{av aol buzb}

\end{document}

在此处输入图片描述

答案4

这里我使用一个 token 循环来实现目标。注意,它可以处理换行和段落中断、自动换行,并且只为 12 类 token 加下划线。

\documentclass{article}
\usepackage{tokcycle}
\def\mystrut{\strut\rule[-15pt]{0pt}{0pt}}
\Characterdirective{\ifcat A#1
  \addcytoks{\underline{\mystrut#1}\nobreak\hspace{1pt}}\else
  \addcytoks{#1}\fi}
\Spacedirective{\addcytoks{#1\allowbreak}}
\begin{document}
\tokencyclexpress Sla'z hszv lewyzz nyhapabkl\endtokencyclexpress

\tokencyclexpress av aol buzb.\endtokencyclexpress

\tokencyclexpress Here is a test for manual line breaks\\
and also natural word wrapping 
and  natural word wrapping 
and also natural word wrapping 
and  natural word wrapping 
and also natural word wrapping 
and also natural word wrapping.\endtokencyclexpress
\end{document}

在此处输入图片描述

相关内容