япростонужно обрезать текстовую строку, которая представляет собой просто последовательность символов без пробелов, поэтому перенос строки не сработает. Мне просто нужно определить длину строки в сантиметрах, остальное нужно обрезать.
Я нашел посылку.обрезной зажимчто могло бы это сделать, но мне нужен способ сделать это без использования этого пакета (я все еще могу использовать существующие, общие пакеты)
Надеюсь, есть еще одна возможность. Я нашелочень хороший способсделать это, если вы хотите обрезать веревку с правой стороны. Но мне нужно с другой стороны.
Я приведу краткий пример того, как должен выглядеть мой документ:
\documentclass{article}
\newcommand\magicCommand[1]{
...
}
\begin{document}
\begin{table}[htb]
\begin{center}
\begin{tabular}{l}
\begin{tabular}{|ll|}
\hline
\parbox{50mm}{ \magicCommand{3cm}{veryLongStringWhichIsGoingToLookUglyInMyDocument}} & \parbox{40mm}{ abc }\\
\hline
\end{tabular}
\end{tabular}
\end{center}
\end{table}
\end{document}
Текст для приведенного выше примера должен выглядеть в документе следующим образом:
veryLongStri
\РЕДАКТИРОВАТЬ
Извините за столь длинное редактирование, но я совсем запутался. truncate
Кажется, что-то глючит (в зависимости от строки), и, как вы видите, я провел несколько других тестов. Есть некоторые решения, которые, кажется, работают правильно. Я не знаю, какая проблема у меня была раньше, потому что некоторые версии работали только вне табличных сред.
test.tex
\documentclass[10pt]{article}
\usepackage{a4,graphicx}
\usepackage[breakwords]{truncate}
\setlength{\oddsidemargin}{0cm}
\setlength{\evensidemargin}{0cm}
\setlength{\topmargin}{-2.0cm}
\setlength{\textwidth}{16cm}
\setlength{\textheight}{28.65cm}
\setlength{\headsep}{1.0cm}
\setlength{\parindent}{1.0cm}
\newcommand{\singlespace}{\renewcommand{\baselinestretch}{1.0}\small\normalsize}\newcommand{\doublespace}{\renewcommand{\baselinestretch}{1.5}\small\normalsize}
\renewcommand{\floatpagefraction}{0.95}
\renewcommand{\textfraction}{0.05}
\renewcommand{\topfraction}{0.95}
\renewcommand{\bottomfraction}{0.95}
%===new===
\newlength{\stringlen}
\newbox\stringbox
\newcommand{\clipstring}[2][6cm]{%
\setlength\stringlen{#1}%
\sbox\stringbox{}%
\doclipstring#2\doclipstring
}
\makeatletter
\newcommand{\doclipstring}[1]{%
\ifx#1\doclipstring
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\unhbox\stringbox}%
{\check@cliplength{#1}}%
}
\def\check@cliplength#1{%
\sbox\stringbox{\unhcopy\stringbox #1}
\ifdim\wd\stringbox>\stringlen
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\unhbox\stringbox\removetrailing}%
{\doclipstring}%
}
\def\removetrailing#1\doclipstring{}
\makeatother
%=========
\usepackage{xcolor}
\newcommand\tleft[3][white]{%
\setbox0=\hbox{\x}%
\makebox[#2][l]{%
\ooalign{\mbox{#3}\cr\kern#2\textcolor{#1}{%
\rule[-\dp0]{\wd0}{\dimexpr\dp0+\ht0}}}}%
}
%=========
\makeatletter
\newcommand\jw[2][2cm]{%
\leavevmode
\begingroup
\setbox0=\hbox{#2}%
\setbox0=\hbox{%
\pdfsave
\pdfliteral{%
0 \dim@in@bp{-\dp0 } \dim@in@bp{#1} \dim@in@bp{\ht0 + \dp0 }
re W n}%
\rlap{\box0 }%
\pdfrestore
\hskip#1 %
}%
\box0 %
\endgroup
}
\newcommand\dim@in@bp[1]{%
\strip@pt\dimexpr(#1) * 800/803\relax
}
\makeatother
%=========
\begin{document}
\pagestyle{empty}
\begin{table}[htb]
\begin{center}
\begin{tabular}{l}
\begin{tabular}{|ll|}
\hline
\parbox{60mm}{ thoseAreTheVeryLongStringsWeWantToCutOtherwiseTheTableLooksLikeCrap\_bad }& \parbox{80mm}{ 0.031 }\\
\parbox{60mm}{ \truncate{6cm}{qwfioqoiwefjiuwgwejfmqefiuhSiqwdMwqkdwqmkMqdwmDWmdwklqwdmlDMlkqwlkdMDLWQd} }& \parbox{80mm}{ 2.047 }\\
\parbox{60mm}{ \truncate{6cm}{qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\_qqqq} }& \parbox{80mm}{ 2.047 }\\
\parbox{60mm}{ \truncate{6cm}{aaaaaaaa\_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\_qqqq} }& \parbox{80mm}{ 2.047 }\\
\parbox{60mm}{ \truncate{6cm}{truncate\_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\_qqqq} }& \parbox{80mm}{ 2.047 }\\
\parbox{60mm}{ \truncate{6cm}{thoseAreTheVeryLongStringsWeWantToCutOtherwiseTheTableLooksLikeCrap\_good} }& \parbox{80mm}{ 1.023 }\\
\parbox{60mm}{ \clipstring{clipstring\_thoseAreTheVeryLongStringsWeWantToCutOtherwiseTheTableLooksLikeCrap} }& \parbox{80mm}{ 1.023 }\\
\parbox{60mm}{ \tleft{6cm}{tleft\_thoseAreTheVeryLongStringsWeWantToCutOtherwiseTheTableLooksLikeCrap} }& \parbox{80mm}{ 1.023 }\\
\parbox{60mm}{ \jw[6cm]{jw\_thoseAreTheVeryLongStringsWeWantToCutOtherwiseTheTableLooksLikeCrap} }& \parbox{80mm}{ 1.023 }\\
\parbox{60mm}{ \jw[6cm]{jw\_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\_qqqq} }& \parbox{80mm}{ 1.023 }\\
\hline
\end{tabular}
\end{tabular}
\end{center}
\end{table}
\end{document}
testoutput
pdflatex.log
This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6)
%&-line parsing enabled.
entering extended mode
(./test.tex
LaTeX2e <2005/12/01>
Babel <v3.8h> and hyphenation patterns for english, usenglishmax, dumylang, noh
yphenation, arabic, basque, bulgarian, coptic, welsh, czech, slovak, german, ng
erman, danish, esperanto, spanish, catalan, galician, estonian, farsi, finnish,
french, greek, monogreek, ancientgreek, croatian, hungarian, interlingua, ibyc
us, indonesian, icelandic, italian, latin, mongolian, dutch, norsk, polish, por
tuguese, pinyin, romanian, russian, slovenian, uppersorbian, serbian, swedish,
turkish, ukenglish, ukrainian, loaded.
(/usr/share/texmf/tex/latex/base/article.cls
Document Class: article 2005/09/16 v1.4f Standard LaTeX document class
(/usr/share/texmf/tex/latex/base/size10.clo))
(/usr/share/texmf/tex/latex/ntgclass/a4.sty)
(/usr/share/texmf/tex/latex/graphics/graphicx.sty
(/usr/share/texmf/tex/latex/graphics/keyval.sty)
(/usr/share/texmf/tex/latex/graphics/graphics.sty
(/usr/share/texmf/tex/latex/graphics/trig.sty)
(/usr/share/texmf/tex/latex/config/graphics.cfg)
(/usr/share/texmf/tex/latex/pdftex-def/pdftex.def)))
(/usr/share/texmf/tex/latex/ltxmisc/truncate.sty)
(/usr/share/texmf/tex/latex/xcolor/xcolor.sty
(/usr/share/texmf/tex/latex/config/color.cfg)) (./test.aux)
Overfull \hbox (194.49529pt too wide) in paragraph at lines 96--96
[]\OT1/cmr/m/n/10 thoseAreTheVeryLongStringsWeWantToCutOtherwiseTheTableLooksLi
keCrap[]bad
Overfull \hbox (207.60631pt too wide) detected at line 99
\OT1/cmr/m/n/10 qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqq[]qqqq
Overfull \hbox (251.20644pt too wide) detected at line 100
\OT1/cmr/m/n/10 aaaaaaaa[]qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqq[]qqqq
Overfull \hbox (3.02272pt too wide) in paragraph at lines 104--104
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][
]\OT1/cmr/m/n/10 c[]l[]i[]p[]s[]t[]r[]i[]n[]g[][][]t[]h[]o[]s[]e[]A[]r[]e[]T[]h
[]e[]V[]e[]r[]y[]L[]o[]n[]g[]S[]t[]r[]i[]n[]g[]s[]
! Undefined control sequence.
\\tleft [#1]#2#3->\setbox 0=\hbox {\x
}\makebox [#2][l]{\ooalign {\mbox {#3}...
l.106 ...antToCutOtherwiseTheTableLooksLikeCrap} }
& \parbox{80mm}{ 1.023 }\\
? [1{/usr/share/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./test.aux) )</usr/sh
are/texmf/fonts/type1/bluesky/cm/cmr10.pfb>
Output written on test.pdf (1 page, 12123 bytes).
Transcript written on test.log.
решение1
Использовать truncate
пакет
\documentclass{article}
\usepackage[breakwords]{truncate}
\begin{document}
\truncate{3cm}{This text has been~truncated}
\end{document}
Пакет использует умную стратегию, основанную на переносах. Но предупреждаю: если вы просто вставите длинные бессмысленные последовательности букв, могут возникнуть проблемы с поиском точки останова. Используйте разумный текст, и это работает очень хорошо. Обязательно прочтите документацию. Использовать texdoc truncate
из командной строки — это самый быстрый способ.
решение2
При выполнении большинства манипуляций с блоками вы можете ссылаться на \width
, который содержит естественную ширину блока.
\documentclass{article}
\usepackage{trimclip}
\newcommand\clipstring[2][3cm]{%
\clipbox{0pt 0pt {\dimexpr\width-#1\relax} 0pt}{#2}%
}
\begin{document}
\clipstring{veryLongStringWhichIsGoingToLookUglyInMyDocument} is
not too long any more
\makebox[3cm]{\hrulefill} is not too long any more
\end{document}
Я добавил необязательный аргумент к \clipstring
, чтобы вы могли регулировать длину во время выполнения, скажем, с помощью \clipstring[2cm]{...}
.
Вам может понадобиться макрос, который обрезает строку в машинописном шрифте, указывая количество сохраняемых символов:
\documentclass{article}
\usepackage{trimclip}
\newcommand\clipstring[2][3cm]{%
\clipbox{0pt 0pt {\dimexpr\width-#1\relax} 0pt}{#2}%
}
\newcommand\clipttstring[2][10]{%
\texttt{\clipbox{0pt 0pt {\dimexpr\width-(#1em)/2\relax} 0pt}{#2}}%
}
\begin{document}
\clipstring{veryLongStringWhichIsGoingToLookUglyInMyDocument} is
not too long any more
\makebox[3cm]{\hrulefill} is not too long any more % check
\clipttstring{veryLongStringWhichIsGoingToLookUglyInMyDocument} is
not too long any more
\texttt{0123456789} is not too long any more % check
\end{document}
Значение по умолчанию — 10. Используйте его, \clipttstring[6]{...}
чтобы сохранить только шесть символов.
Вместо этого вот макрос, который остановит печать символов при превышении фиксированной длины.
\documentclass{article}
\newlength{\stringlen}
\newbox\stringbox
\newcommand{\clipstring}[2][3cm]{%
\setlength\stringlen{#1}%
\sbox\stringbox{}%
\doclipstring#2\doclipstring
}
\makeatletter
\newcommand{\doclipstring}[1]{%
\ifx#1\doclipstring
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\unhbox\stringbox}%
{\check@cliplength{#1}}%
}
\def\check@cliplength#1{%
\sbox\stringbox{\unhcopy\stringbox #1}
\ifdim\wd\stringbox>\stringlen
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\unhbox\stringbox\removetrailing}%
{\doclipstring}%
}
\def\removetrailing#1\doclipstring{}
\makeatother
\begin{document}
\clipstring{veryLongStringWhichIsGoingToLookUglyInMyDocument} is
not too long any more
\makebox[3cm]{\hrulefill} is not too long any more % check
\clipstring{shrt} is short
\end{document}
Ограничения: аргумент должен представлять собой строку простых символов ASCII; однако без пробелов и букв с диакритическими знаками.
Похожее решение, но с подсчетом сохраняемых символов (по умолчанию десять).
\documentclass{article}
\makeatletter
\newcommand\stringclip[2][10]{%
\@tempcnta=#1\relax
\@tempcntb=\z@
\toks@={}%
\do@stringclip#2\do@stringclip
}
\def\do@stringclip#1{%
\ifx#1\do@stringclip
\the\toks@\expandafter\@gobble
\else
\advance\@tempcntb\@ne
\expandafter\@firstofone
\fi
{\check@one@more{#1}}%
}
\def\check@one@more#1{%
\ifnum\@tempcntb=\@tempcnta
\the\toks@ #1%
\expandafter\@firstoftwo
\else
\toks@=\expandafter{\the\toks@ #1}%
\expandafter\@secondoftwo
\fi
{\gobble@toend}%
{\do@stringclip}%
}
\def\gobble@toend#1\do@stringclip{}
\makeatother
\begin{document}
\stringclip{01234567890123456789}
\stringclip[5]{01234567890123456789}
\stringclip{012345}
\end{document}
решение3
Решение, использующее обрезку поля на уровне драйвера, доступнос помощью expl3
(интерфейс какверсия egreg):
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\NewDocumentCommand \clipstring { O { 2cm } m }
{
\erp_clip:nn {#2} {#1}
}
\box_new:N \l__erp_box
\cs_new_protected:Npn \erp_clip:nn #1#2
{
\leavevmode
\hbox_set:Nn \l__erp_box {#1}
\box_set_wd:Nn \l__erp_box {#2}
\box_clip:N \l__erp_box
\box_use:N \l__erp_box
}
\ExplSyntaxOff
\begin{document}
\clipstring[3cm]{veryLongStringWhichIsGoingToLookUglyInMyDocument} is
not too long any more
\makebox[3cm]{\hrulefill} is not too long any more % check
\end{document}
Если никакие пакеты не разрешены, мы можем сделать то же самое, перекодировав низкоуровневое отсечение «вручную». Это привязано к одному драйверу, но это может быть приемлемо. Например, используя pdfTeX или LuaTeX для прямого производства PDF, вышеприведенное «записано»
\documentclass{article}
\makeatletter
\newcommand\clipstring[2][2cm]{%
\leavevmode
\begingroup
\setbox0=\hbox{#2}%
\setbox0=\hbox{%
\pdfsave
\pdfliteral{%
0 \dim@in@bp{-\dp0 } \dim@in@bp{#1} \dim@in@bp{\ht0 + \dp0 }
re W n}%
\rlap{\box0 }%
\pdfrestore
\hskip#1 %
}%
\box0 %
\endgroup
}
\newcommand\dim@in@bp[1]{%
\strip@pt\dimexpr(#1) * 800/803\relax
}
\makeatother
\begin{document}
\clipstring[2.95cm]{veryLongStringWhichIsGoingToLookUglyInMyDocument} is
not too long any more
\makebox[2.95cm]{\hrulefill} is not too long any more % check
\end{document}
(Я внес несколько незначительных изменений, поскольку в этом случае я могу жестко закодировать некоторые вещи, которые не могу сделать при написании expl3
кода драйвера!)
решение4
Здесь используется xcolor
вместо trimclip
. Как правильно указывает egreg, мой исходный ответ не будет работать на цветном фоне. Поэтому я ОТРЕДАКТИРОВАЛ его, добавив необязательный аргумент, где можно указать цвет фона (по умолчанию белый).
ОТРЕДАКТИРОВАНО для замены локальной переменной \x
внутри \tleft
определения на (ой!) #3
.
\documentclass{article}
\usepackage{xcolor}
\newcommand\tleft[3][white]{%
\setbox0=\hbox{#3}%
\makebox[#2][l]{%
\ooalign{\mbox{#3}\cr\kern#2\textcolor{#1}{%
\rule[-\dp0]{\wd0}{\dimexpr\dp0+\ht0}}}}%
}
\begin{document}
\def\x{This is my very long string}
\x
\rule{1.4cm}{2pt}
\tleft{1.4cm}{\x}NEXT
\end{document}