Inicialmente resolvi esse problema de justificativa nesta outra questãoComo a declaração de justificativa `\everypar` poderia ser usada?, porém agora estou percebendo um novo problema que também gostaria que fosse resolvido automaticamente.
Ao escrever este código de látex, obtive corretamente o comportamento desejado:
% proposal.tex
% Based on http://www.latextemplates.com/template/simple-sectioned-essay
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[a4paper, margin=2cm]{geometry}
\usepackage[brazil]{babel}
\usepackage{hyphsubst}
\usepackage{mathptmx}
\begin{document}
\section{Riscos}
\newbox\linebox \newbox\snapbox
\def\eatlines{
\setbox\linebox\lastbox % check the last line
\ifvoid\linebox
\else % if it’s not empty
\unskip\unpenalty % take whatever is
{\eatlines} % above it;
\setbox\snapbox\hbox{\unhcopy\linebox}
\ifdim\wd\snapbox<.98\wd\linebox
\box\snapbox % take the one or the other,
\else \box\linebox \fi
\fi}
\everypar={\setbox0=\lastbox \par
\vbox\bgroup \everypar={}\def\par{\endgraf\eatlines\egroup}}
In typesetting advertisement copy, a way of justifying paragraphs has
become popular in recent years that is somewhere between flushright
and raggedrightddddd setting. Lines that would stretch beyond certain limits
are set with their glue at natural width. This single paragraph is but an
example of this procedure; the macros are given next.
\medskip
Second paragraph.
\end{document}
O que produz este PDF, recuado corretamente, dado .98
o fator utilizado:
Porém se houver uma palavra muito grande na linha, latex está gerando o erro Overfull \hbox (133.24454pt too wide) in paragraph at lines
, dada a entrada:
In typesetting advertisement copy, a way of justifying paragraphs has
become popular in recent years that is somewhere between flushright
and raggedrightdddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
setting. Lines that would stretch beyond certain limits
are set with their glue at natural width. This single paragraph is but an
example of this procedure; the macros are given next.
\medskip
Second paragraph.
O que gera a saída:
Pergunta
Gostaria que o latex quebrasse automaticamente a palavra raggedrightdddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
em uma nova linha, em vez de permitir que ela fosse além da tela/documento.
Eu sei que posso usar a seguinte solução deEmpurre palavras longas em uma nova linha, então a palavra raggedrightdddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
será dividida em uma nova linha:
% Allow to push long words on new lines when they do not fit entirely on the current line.
\newcommand\lword[1]{\leavevmode\nobreak\hskip0pt plus\linewidth\penalty50\hskip0pt plus-\linewidth\nobreak{#1}}
In typesetting advertisement copy, a way of justifying paragraphs has
become popular in recent years that is somewhere between flushright
and \lword{raggedrightdddddddddddddddddddddddddddddddddddddddddddddddddddddddddd}
setting. Lines that would stretch beyond certain limits
are set with their glue at natural width. This single paragraph is but an
example of this procedure; the macros are given next.
\medskip
Second paragraph.
O que gera o seguinte documento:
Que agora também tem outra palavra quebrando os limites da página. Portanto, a solução seria novamente colocar \lword{that}
a that
palavra que se tornou desonesta.
Portanto, este é um trabalho muito chato para contornar a correção de documentos de látex. Espero que a intenção do látex seja permitir que eu me preocupe com o conteúdo do documento, e não com a estética do documento.
Como posso fazer o látex corretamente e inserir automaticamente palavras longas em novas linhas, em vez de contornar o documento colocando \lword{...}
?
Atualização 1
Depois@David Carlisleresposta Tenho um novo problema, usando este documento:
% proposal.tex
% Based on http://www.latextemplates.com/template/simple-sectioned-essay
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[a4paper, margin=2cm]{geometry}
\usepackage[brazil]{babel}
\usepackage{hyphsubst}
\usepackage{mathptmx}
\begin{document}
\section{Riscos}
\newbox\linebox \newbox\snapbox
\def\eatlines{
\setbox\linebox\lastbox % check the last line
\ifvoid\linebox
\else % if it’s not empty
\unskip\unpenalty % take whatever is
{\eatlines} % above it;
\setbox\snapbox\hbox{\unhcopy\linebox}
\ifdim\wd\snapbox<.98\wd\linebox
\box\snapbox % take the one or the other,
\else \box\linebox \fi
\fi}
\everypar={\setbox0=\lastbox \par
\vbox\bgroup \everypar={}\def\par{\endgraf\eatlines\egroup}}
\noindent X\dotfill X
\sloppy
\rightskip 0pt plus 1pt
\emergencystretch\textwidth
\hyphenpenalty=10000
\parskip\baselineskip
In typesetting advertisement copy, a way of justifying paragraphs has
become popular in recent years that is somewhere between flushright
and raggedrightdddddddddddddddddddddddddddddddddddddddddddd setting. Lines that would stretch beyond certain limits
are set with their glue at natural width. This single paragraph is but an
example of this procedure; the macros are given next.
\medskip
Second paragraph.
\end{document}
Eu tenho um buraco extra, que não deveria existir:
O buraco na segunda linha é esperado quando a palavra longa foi pressionada. Porém o buraco na primeira linha não é esperado.
A final deveria ser assim:
Esta imagem anterior pode ser criada usando o comando \lword{raggedrightdddddddddddddddddddddddddddddddddddddddddddd}
, exemplo:
% proposal.tex
% Based on http://www.latextemplates.com/template/simple-sectioned-essay
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[a4paper, margin=2cm]{geometry}
\usepackage[brazil]{babel}
\usepackage{hyphsubst}
\usepackage{mathptmx}
\begin{document}
\section{Riscos}
\newbox\linebox \newbox\snapbox
\def\eatlines{
\setbox\linebox\lastbox % check the last line
\ifvoid\linebox
\else % if it’s not empty
\unskip\unpenalty % take whatever is
{\eatlines} % above it;
\setbox\snapbox\hbox{\unhcopy\linebox}
\ifdim\wd\snapbox<.98\wd\linebox
\box\snapbox % take the one or the other,
\else \box\linebox \fi
\fi}
\everypar={\setbox0=\lastbox \par
\vbox\bgroup \everypar={}\def\par{\endgraf\eatlines\egroup}}
\newcommand\lword[1]{\leavevmode\nobreak\hskip0pt plus\linewidth\penalty50\hskip0pt plus-\linewidth\nobreak{#1}}
In typesetting advertisement copy, a way of justifying paragraphs has
become popular in recent years that is somewhere between flushright
and \lword{raggedrightdddddddddddddddddddddddddddddddddddddddddddd} setting. Lines that would stretch beyond certain limits
are set with their glue at natural width. This single paragraph is but an
example of this procedure; the macros are given next.
\medskip
Second paragraph.
\end{document}
Atualização 2
O problema é a automação da escrita do texto. Geralmente isso acontece nos dois sentidos, porém é um problema de látex que permite que as palavras ultrapassem a linha. Portanto, o que eu quero é apenas uma solução para isso. A primeira ferramenta de látex para esse problema de palavras longas são os hífens. No entanto, eu não gosto deles. Além disso, prefiro apenas colocar a palavra na próxima linha, como neste exemplo:https://i.stack.imgur.com/f6Bes.png, Para mim, é uma solução direta. O látex nunca deve permitir que uma palavra ultrapasse o limite de páginas. Tente fazer isso Microsoft Word, não vai permitir. Em vez disso, colocará a palavra na próxima linha.
Gostaria de uma justificativa de linha, exceto algumas linhas específicas que contêm palavras longas ou são muito esparsas devido à justificativa. Para a maioria das linhas, a justificação funciona bem, exceto nos casos mencionados.
É assim que o Microsoft Word lida com isso:
Embora a linha antes da palavra longa estivesse mal justificada, ela não permitia que a palavra longa ultrapassasse o limite da linha.
Responder1
Supondo que a pergunta específica seja mais como "Preciso imprimir caminhos de arquivos longos de maneira sensata", que tal isso?
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[a4paper, margin=2cm]{geometry}
% https://tex.stackexchange.com/a/10401
\usepackage[hyphens]{url}
\expandafter\def\expandafter\UrlBreaks\expandafter{\UrlBreaks% save the current one
\do\a\do\b\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j%
\do\k\do\l\do\m\do\n\do\o\do\p\do\q\do\r\do\s\do\t%
\do\u\do\v\do\w\do\x\do\y\do\z\do\A\do\B\do\C\do\D%
\do\E\do\F\do\G\do\H\do\I\do\J\do\K\do\L\do\M\do\N%
\do\O\do\P\do\Q\do\R\do\S\do\T\do\U\do\V\do\W\do\X%
\do\Y\do\Z}
\begin{document}
\section{Riscos}
Original bad breaks, Assim após ativar os testes, basta abrir o arquivo
ArtificialIntelligence/AnswersGuessAiGame/players.py, encontrar a classe ...
Tests logo do final do arquivo e escolher quais dos testes se quer executar.
Option 1, rewrite the paragraph to avoid bad breaks.
Assim após ativar os testes, basta abrir o arquivo
ArtificialIntelligence/AnswersGuessAiGame/players.py, encontrar a classe ...
Tests logo do final do arquivo e escolher quais dos testes se quer executar.
Option 2, use the \verb|\path| command from the \verb|url| package, and allow
URLs to break after any character.
Assim após ativar os testes, basta abrir o arquivo
\path{ArtificialIntelligence/AnswersGuessAiGame/players.py}, encontrar a classe ...
Tests logo do final do arquivo e escolher quais dos testes se quer executar.
\end{document}