我想用等宽字体(使用\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
,这样做是为了确保类别代码正确)。您输入的整个文本是\detokenize
d,文本内的空格将被忽略。
编辑:我不知怎么忘了把...放入\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}