平均能量损失

平均能量损失

我想用等宽字体(使用\texttt)写出没有空格的长文本。由于换行符不会自动出现,我找到了这个答案:https://tex.stackexchange.com/a/315376,建议使用宏。

由于我希望文本在几个不同的符号处中断,我尝试更改宏以接受带有要中断的符号的参数。不幸的是,这无法正常工作,如下面的屏幕截图所示。

渲染文本的屏幕截图

这是我的宏版本:

\documentclass{article}

\newcommand*\ttcomma[1]{\texttt{\expandafter\dottvar{\detokenize{#1}}{,}\relax}}
\newcommand*\dottvar[2]{%
\ifx\relax#1\else%
  \expandafter%
    \ifx\string#2#1%
      \string#2\allowbreak%
    \else#1
    \fi
\expandafter\dottvar\fi
}

\begin{document}
Some normal Text \ttcomma{someLongTextWithoutSpacesButWithCommas,WhereIWantToGetALineFeedAndBreakToTheNextLine}

\end{document}

我哪里做错了?附加问题:如何更改宏以在几个不同的符号处进行换行(例如,,,):-

答案1

这是一个expl3实现,您可以在运行时设置允许的断点。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\ttlong}{O{\c_silvernak_ttlong_breaks_str}m}
 {
  \group_begin:
  \ttfamily
  \silvernak_ttlong:nn { #1 } { #2 }
  \group_end:
 }

% the default break points
\str_const:Nn \c_silvernak_ttlong_breaks_str { , : - }

\cs_new_protected:Nn \silvernak_ttlong:nn
 {
  \str_set:Nx \l__silvernak_breaks_str { #1 }
  \str_map_function:nN { #2 } \__silvernak_ttlong_char:n
 }

\cs_new_protected:Nn \__silvernak_ttlong_char:n
 {
  #1
  \str_if_in:NnT \l__silvernak_breaks_str { #1 } { \skip_horizontal:n { 0pt } }
 }

\ExplSyntaxOff

\begin{document}

\parbox{0pt}{
  Some normal Text \ttlong{someLongTextWithoutSpacesButWithCommas,WhereIWantToGetALine-FeedAndBreakTo:TheNextLine}
}

\bigskip

\parbox{0pt}{
  Some normal Text \ttlong[,]{someLongTextWithoutSpacesButWithCommas,WhereIWantToGetALine-FeedAndBreakTo:TheNextLine}
}

\bigskip

\parbox{0pt}{
  Some normal Text \ttlong[,:-a]{someLongTextWithoutSpacesButWithCommas,WhereIWantToGetALine-FeedAndBreakTo:TheNextLine}
}

\end{document}

此处\parbox仅用于强制尽可能多的换行。

在此处输入图片描述

这个想法是逐个字符映射给定的字符串;如果当前字符在允许的换行点列表中,则添加零跳过。

答案2

您可以使用以下内容,只需将您想要分解的每个字符添加到 的定义中\breakable(在 内\detokenize,这样做是为了确保类别代码正确)。您输入的整个文本是\detokenized,文本内的空格将被忽略。

编辑:我不知怎么忘了把...放入\ttfamily宏中...

\documentclass[]{article}

\makeatletter
\edef\breakables{\detokenize{,:-.}}
\def\end@ttbreakable{\end@ttbreakable}
\newif\if@ttbreakable@break
\def\my@fi@gt\fi#1#2{\fi}
\newcommand*\ttbreakable[1]
  {%
    \begingroup
    \ttfamily
    \expandafter\@ttbreakable\detokenize{#1}\end@ttbreakable
    \endgroup
  }
\newcommand*\@ttbreakable[1]
  {%
    \ifx\end@ttbreakable#1%
      \my@fi@gt
    \fi
    \@firstofone
    {%
      #1%
      \def\@ttbreakable@test##1#1##2\end@ttbreakable
        {%
          \if\relax\detokenize{##2}\relax
          \else
            \allowbreak
          \fi
        }%
      \expandafter\@ttbreakable@test\breakables#1\end@ttbreakable
      \@ttbreakable
    }%
  }
\makeatother

\begin{document}
\hsize=5cm
\ttbreakable
  {%
    This is some text, with no spaces, but commas.
    It has: colons- hyphens and .periods, too.
  }
\end{document}

答案3

你可以用这个包来实现这一点,但会有一些副作用url。虽然文本会被逐字处理,这可能不是你想要的。但至少它提供了一个现有的界面来设置断点。

平均能量损失

\documentclass{article}

\usepackage{url}

\DeclareUrlCommand\ttbreakable{%
  \def\UrlBreaks{\do\,\do\:\do\-}%
  \def\UrlBigbreaks{}%
  \def\UrlNoBreaks{}%
  \def\UrlOrds{}%
  \def\UrlSpecials{}%
  \def\UrlFont{\ttfamily}}

\begin{document}

% Need a sloppy par otherwise the first line is too underfull and won't break
% at the first comma
\begin{sloppypar}
  Some normal Text
  \ttbreakable{someLongTextWithoutSpacesButWithCommas,WhereIWantToGetALine-FeedAndBreakTo:TheNextLine}
\end{sloppypar}

\parbox{0pt}{%
  Some normal Text
  \ttbreakable{someLongTextWithoutSpacesButWithCommas,WhereIWantToGetALine-FeedAndBreakTo:TheNextLine}}

\end{document}

MWE 输出

相关内容