如何生成单词之间的非空格?

如何生成单词之间的非空格?

在原本普通的 Latex 文档中,我有一长串字符串,需要用 分隔<space> <cdot> <space>。输出需要如下所示:

Lorem <cdot> ipsum  <cdot> dolor <cdot> sit
amet <cdot> consectetuer <cdot> adipiscing

编写一个很简单\newcommand{\foo}[1]{\mbox{#1} \ $\cdotp$\ \ },但是这种方法无法识别 TeX 的换行符,因此会产生如下输出

Lorem <cdot> ipsum  <cdot> dolor <cdot> sit
<cdot> amet <cdot> consectetuer <cdot>  <<<--- <cdot> at beginning and end of line
adipiscing

如果有任何差异,请\raggedright参阅本文件。

这个问题感觉像是涉及到 TeX 的行和段落中断,对我来说,这就像是进入了怪物之地。

答案1

以下是使用宏或环境的解决方案:

\documentclass{article}
\usepackage{xparse,environ}

\ExplSyntaxOn
\NewDocumentCommand{\changespace}{ O{\nobreakspace$\cdot$~} +m }
 {
  \cdotp_changespace:nn { #1 } { #2 }
 }

\tl_new:N \l_cdotp_phrases_tl
\cs_new_protected:Npn \cdotp_changespace:nn #1 #2
 {
  \tl_set:Nn \l_cdotp_phrases_tl { #2 }
  \tl_replace_all:Nnn \l_cdotp_phrases_tl { ~ } { #1 }
  \tl_use:N \l_cdotp_phrases_tl
 }
\cs_generate_variant:Nn \cdotp_changespace:nn { nV }

\NewEnviron{spaces}[1][\nobreakspace$\cdot$~]
 {
  \cdotp_changespace:nV { #1 } \BODY
 }
\ExplSyntaxOff

\begin{document}
\changespace{Lorem ipsum  dolor sit
amet consectetuer adipiscing.

Something else  with   multiple  spaces.}

\changespace[~X ]{Lorem ipsum  dolor sit
amet consectetuer adipiscing.

Something else  with   multiple  spaces.}

\begin{spaces}
Lorem ipsum  dolor sit
amet consectetuer adipiscing.

Something else  with   multiple  spaces.
\end{spaces}

\end{document}

可选参数用于更改分隔符。回想一下,\ExplSyntaxOn和之间\ExplSyntaxOff必须指定一个空格,如~

在此处输入图片描述


如果你希望在换行符和段落末尾点消失,使用 raggedright 设置,这里有一个改编的Marcin Woliński 的技巧

\documentclass{article}
\usepackage{xparse,environ,textcomp}
\ExplSyntaxOn
\tl_new:N \l_cdotp_phrases_tl
\cs_new_protected:Npn \cdotp_changespace:n #1
 {
  \tl_set:Nn \l_cdotp_phrases_tl { #1 }
  \tl_replace_all:Nnn \l_cdotp_phrases_tl { ~ } { \disappearingdot }
  \tl_use:N \l_cdotp_phrases_tl
 }
\cs_generate_variant:Nn \cdotp_changespace:n { V }

\NewEnviron{spaces}
 {\raggedright\def\par{\unskip\unskip\endgraf}
  \cdotp_changespace:V \BODY
 }

\ExplSyntaxOff

\newcommand{\disappearingdot}{%
 \hskip 1pt plus 2pt
 \cleaders\hbox to.2em{\hss$\cdot$\hss}\hskip.2em\relax
 \hskip 1pt plus 2pt\relax}

\begin{document}

\begin{spaces}
Lorem ipsum  dolor sit
amet consectetuer adipiscing.
Lorem ipsum  dolor sit
amet consectetuer adipiscing.
Lorem ipsum  dolor sit
amet consectetuer adipiscing.

Lorem ipsum  dolor sit
amet consectetuer adipiscing.
Lorem ipsum  dolor sit
amet consectetuer adipiscing.
Lorem ipsum  dolor sit
amet consectetuer adipiscing.
Lorem ipsum  dolor sit
amet consectetuer adipiscing.
Lorem ipsum  dolor sit
amet consectetuer adipiscing.

\end{spaces}


\end{document}

在此处输入图片描述

答案2

[已编辑以表明该方法可以适用于预定义字符串]。

stringstrings 包旨在对字符串进行操作(当然!)。它的\convertchar例程采用第一个参数中给出的字符串,并查找第二个参数给出的字符的出现情况。当它找到它们时,它会用第三个参数替换它们。虽然许多常见的字符宏都可以被 stringstrings 理解(即可消化),但它通常无法消化字符串中的宏。这可以通过\encodetoken包的功能以“有限”的方式规避,该功能本质上使宏为包所知(限制在于包可以同时处理的“未知”宏的数量)。

注意:stringstrings 例程将区分硬空格和软空格,如下面的更新示例所示,其中硬空格用于段落的第 1、2 和 3 个单词之间:

\documentclass{article}
\usepackage{stringstrings}
\makeatletter
\def\@MAXSTRINGSIZE{4096}
\makeatother
\begin{document}

\def\x{%
Lorem~ipsum~dolor sit amet, consectetuer adipiscing elit. Ut purus elit,
vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum
gravida mauris. Nam arcu libero, nonummy eget, consectetuer id,
vulputate a, magna.  Donec vehicula augue eu neque. Pellentesque
habitant morbi tristique senectus et netus et malesuada fames ac turpis
egestas. Mauris ut leo. Cras viverra metus rhoncus sem. Nulla et lectus
vestibulum urna fringilla ultrices.  Phasellus eu tellus sit amet tortor
gravida placerat. Integer sapien est, iaculis in, pretium quis, viverra
ac, nunc. Praesent eget sem vel leo ultrices bibendum.  Aenean faucibus.
Morbi dolor nulla, malesuada eu, pulvinar at, mollis ac, nulla.
Curabitur auctor semper nulla. Donec varius orci eget risus. Duis nibh
mi, congue eu, accumsan eleifend, sagittis quis, diam. Duis eget orci
sit amet orci dignissim rutrum.}

\encodetoken{\cdot}
\convertchar{\x}{ }{~$\cdot$~}
\decodetoken{\cdot}

\end{document}

在此处输入图片描述

答案3

第一个版本:

\documentclass{article}



\begin{document}

\catcode`\ =13%
\def {~$\cdot$\ }%
\def\Ala{Ala ma kota. }
\def\Alax{\Ala\Ala\Ala\Ala\Ala\Ala\Ala\Ala\Ala\Ala}

\Alax

\catcode`\ =10%

\end{document}

在此处输入图片描述

根据您的澄清,已修改:(刚才我明白了,你的问题有多漂亮。它唤起了段落划分算法的深度方面的一些方面。因此解决方案是一行和原始的 TeX。)

\documentclass{article}

\begin{document}


\def\1{\discretionary{}{}{\mbox{\ $\cdot$\ }}}%
\def\Ala{Ala\1ma\1kota.\1}
\def\Alax{\Ala\Ala\Ala\Ala\Ala\Ala\Ala\Ala\Ala\Ala}

We put\1 breaks only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1only here\1and here\1

\Alax

\end{document}

在此处输入图片描述

相关内容