EUsimplesmenteprecisa truncar uma string de texto, que é apenas uma sequência de caracteres sem espaços em branco, portanto a quebra de linha não funcionará. Só preciso decidir o comprimento do barbante em centímetros, o resto deve ser cortado.
encontrei o pacoteclipe de corteo que poderia fazer isso, mas preciso de uma maneira de fazer isso sem o uso deste pacote (ainda posso usar pacotes comuns existentes)
Espero que haja outra possibilidade. Achei ummaneira muito legalfaça isso se quiser cortar o barbante do lado direito. Mas eu preciso disso do outro lado.
Vou dar um pequeno exemplo de como meu documento deve ficar:
\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}
O texto do exemplo acima deve ter a seguinte aparência no documento:
veryLongStri
\EDITAR
Desculpe por esta longa edição, mas estou bastante confuso. Parece truncate
estar com algum bug (depende da string) e como você pode ver fiz alguns outros testes. Existem algumas soluções que parecem funcionar corretamente. Não sei qual problema tive antes porque algumas versões só funcionavam fora dos ambientes tabulares.
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.
Responder1
Use o truncate
pacote
\documentclass{article}
\usepackage[breakwords]{truncate}
\begin{document}
\truncate{3cm}{This text has been~truncated}
\end{document}
O pacote usa uma estratégia inteligente baseada na hifenização. Mas um aviso: se você apenas inserir longas sequências de letras sem sentido, poderá haver problemas para encontrar um ponto de interrupção. Use texto sensato e funciona muito bem. Leia os documentos. Usar texdoc truncate
na linha de comando é a maneira mais rápida.
Responder2
Ao fazer a maioria das manipulações de caixa, você pode consultar \width
que contém a largura natural da caixa.
\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}
Adicionei um argumento opcional a \clipstring
, para que você possa ajustar a duração em tempo de execução com, digamos, \clipstring[2cm]{...}
.
Você pode querer uma macro que recorte uma string no tipo de máquina de escrever, especificando o número de caracteres a serem mantidos:
\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}
O padrão é 10, use \clipttstring[6]{...}
para manter apenas seis caracteres.
Aqui está, em vez disso, uma macro que interromperá a impressão de caracteres quando o comprimento fixo for excedido.
\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}
Limitações: o argumento deve ser uma sequência de caracteres ASCII simples; sem espaços, porém, e sem letras acentuadas.
Uma solução semelhante, mas contando caracteres para manter (dez por padrão).
\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}
Responder3
Uma solução usando o recorte de caixa no nível do driver acessadoatravés da expl3
(interface comoversão do 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}
Se absolutamente nenhum pacote for permitido, podemos fazer a mesma coisa recodificando o recorte de baixo nível 'manualmente'. Isso está vinculado a um driver, mas pode ser aceitável. Por exemplo, usando pdfTeX ou LuaTeX para produção direta de PDF, o acima 'escrito' é
\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}
(Fiz algumas pequenas alterações, pois neste caso posso codificar algumas coisas que não consigo ao escrever o expl3
código do driver!)
Responder4
Isso usa xcolor
em vez de trimclip
. Como egreg aponta corretamente, minha resposta original não funcionará em um fundo colorido. Então eu EDITEI para adicionar um argumento opcional, onde a cor de fundo pode ser especificada (branco padrão).
EDITADO para substituir a variável local \x
dentro da \tleft
definição por (oops!) #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}