IsimplementeEs necesario truncar una cadena de texto, que es solo una secuencia de caracteres sin espacios en blanco, por lo que el salto de línea no funcionará. Sólo me falta decidir el largo de la cuerda en centímetros, el resto hay que cortarlo.
encontré el paqueteclip de recorteque podría hacerlo, pero necesito una manera de hacerlo sin el uso de este paquete (todavía puedo usar paquetes comunes existentes)
Espero que haya otra posibilidad. Encontre unmuy buena manerahacerlo si quieres cortar la cuerda por el lado derecho. Pero lo necesito del otro lado.
Daré un breve ejemplo de cómo debería verse mi documento:
\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}
El texto del ejemplo anterior debería verse en el documento como:
veryLongStri
\EDITAR
Perdón por esta larga edición, pero estoy bastante confundido. Parece truncate
tener errores de alguna manera (dependiendo de la cadena) y, como puede ver, hice algunas otras pruebas. Hay algunas soluciones que parecen funcionar correctamente. No sé qué problema tuve antes porque algunas versiones solo funcionaban fuera de los entornos 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.
Respuesta1
Usa el truncate
paquete
\documentclass{article}
\usepackage[breakwords]{truncate}
\begin{document}
\truncate{3cm}{This text has been~truncated}
\end{document}
El paquete utiliza una estrategia inteligente basada en la separación de palabras. Pero una advertencia: si simplemente inserta secuencias de letras largas y sin sentido, puede tener problemas para encontrar un punto de interrupción. Utilice texto sensato y funciona muy bien. Lea los documentos. Usar texdoc truncate
desde la línea de comando es la forma más rápida.
Respuesta2
Al realizar la mayoría de las manipulaciones del cuadro, puede consultar \width
el que contiene el ancho natural del cuadro.
\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}
Agregué un argumento opcional a \clipstring
, para que puedas ajustar la longitud en tiempo de ejecución con, por ejemplo, \clipstring[2cm]{...}
.
Es posible que desee una macro que recorte una cadena en tipo de máquina de escribir, especificando la cantidad de caracteres que se conservarán:
\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}
El valor predeterminado es 10; úselo \clipttstring[6]{...}
para conservar solo seis caracteres.
Aquí hay, en cambio, una macro que detendrá la impresión de caracteres cuando se exceda la longitud fija.
\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}
Limitaciones: el argumento debe ser una cadena de caracteres ASCII simples; Sin embargo, no hay espacios ni letras acentuadas.
Una solución similar, pero contando caracteres para conservar (diez por defecto).
\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}
Respuesta3
Se accede a una solución que utiliza el recorte de cuadros a nivel del controladora través de expl3
(interfaz comola versión de 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}
Si no se permite absolutamente ningún paquete, podemos hacer lo mismo recodificando el recorte de bajo nivel "a mano". Esto está ligado a un factor, pero puede ser aceptable. Por ejemplo, al utilizar pdfTeX o LuaTeX para la producción directa de PDF, lo anterior "escrito" es
\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}
(¡Hice algunos cambios menores ya que puedo codificar algunas cosas en este caso que no puedo cuando escribo el expl3
código del controlador!)
Respuesta4
Esto usa xcolor
en lugar de trimclip
. Como señala correctamente egreg, mi respuesta original no funcionará en un fondo de color. Así que lo EDITÉ para agregar un argumento opcional, donde se puede especificar el color de fondo (blanco predeterminado).
EDITADO para reemplazar la variable local \x
dentro de la \tleft
definición con (¡Ups!) #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}