Pergunta

Pergunta

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 .98o fator utilizado:

insira a descrição da imagem aqui

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:

insira a descrição da imagem aqui


Pergunta

Gostaria que o latex quebrasse automaticamente a palavra raggedrightddddddddddddddddddddddddddddddddddddddddddddddddddddddddddem 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 raggedrightddddddddddddddddddddddddddddddddddddddddddddddddddddddddddserá 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:

insira a descrição da imagem aqui

Que agora também tem outra palavra quebrando os limites da página. Portanto, a solução seria novamente colocar \lword{that}a thatpalavra 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:

insira a descrição da imagem aqui

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:

insira a descrição da imagem aqui

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:

insira a descrição da imagem aqui

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?

insira a descrição da imagem aqui

\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}

informação relacionada