O LibreOffice não mostra as equações do Word no modo 'Display' corretamente; Existe um processador de texto Linux que pode?

3

No Microsoft Word, existem duas maneiras de exibir equações; Inline e Display . Uma equação inline está alinhada com o texto (como o nome sugere), para que as equações e o texto possam ser misturados. Uma equação de exibição aparece em sua própria linha e é automaticamente centralizada, assim:

Estassãotrêsequaçõesseparadas,mas,comoestãodefinidasparaomododeexibição,todasaparecemcentralizadaseemsuapróprialinha.Seomododelesforalteradoparainline,todosaparecerãonamesmalinhaenãoserãocentralizados:

MeuproblemaéqueoLibreOfficemostratodasasequaçõesusandoomodoinline,mesmoqueelasestejamdefinidasparaomododeexibiçãonoarquivodocx.SeeucriaroprimeiroexemplousandoasequaçõesdomododeexibiçãoWord,salvá-loeabri-lonoLibreOffice,asequaçõesaparecemcomoseestivessemnomododelinha:

Existe uma configuração que eu possa alterar para obter equações no modo de exibição em suas próprias linhas e centralizadas, como se estivessem no Word? Devido à enorme quantidade de documentos do Word que tenho, prefiro não modificar os documentos individualmente.

Se não, existe um processador de texto alternativo que exiba as equações corretamente?

    
por Aaron Christiansen 23.02.2018 / 10:57

2 respostas

5

Quando uma fórmula é inserida no LibreOffice, ela fica ancorada As Character por padrão.

Issosignificaqueelesecomportadamesmaformaqueospersonagens.Então,tratamosdamesmaformacomosetivéssemostrêscaracteres,porexemplo"abc" em vez de três equações.

  1. Formato - > Alinhar - > Centro
  2. Mova o cursor após a primeira equação e pressione Enter .
  3. Repita o passo 2 para a segunda equação.

Agora, todas as três equações estão centralizadas e em linhas separadas.

Aquiestáoresultadodessasinstruçõesparaoexemplo"abc", mostrando que as fórmulas se comportam da mesma forma que os caracteres. (Pressionando Enter auto-corrigido para maiúscula "A").

Para fazer isso funcionar tanto no MS Word quanto no LibreOffice, talvez use apenas a configuração Inline . No entanto, eu não tenho uma cópia do MS Word para verificar isso, e o Word Online não pode editar fórmulas (mas pode exibi-las se isso for tudo que você precisa).

Existe um processador de texto alternativo que usa a configuração da fórmula Exibir como o MS Word faz? Bem possível; Há várias alternativas pagas ou gratuitas. Qualquer que seja a alternativa escolhida, haverá incompatibilidades de algum tipo.

    
por Jim K 23.02.2018 / 18:36
3

Aceitei que é improvável que exista um processador de texto com essa funcionalidade para o Linux, então decidi automatizar a resposta de Jim K criando um script Ruby.

A origem do problema é que o LibreOffice ignora o elemento m:oMathPara XML, que é também o que o Word coloca em uma equação no modo de exibição para centralizá-lo e colocá-lo em seu próprio parágrafo.

O script Ruby abaixo usa a biblioteca de análise XML do Nokogiri para substituir todas as ocorrências de m:oMathPara pelo padrão w:p paragraph, que também são formatadas para serem alinhadas ao centro. Ele faz o seguinte:

  1. Copia o DOCX (especificado como um argumento da linha de comando) para /tmp , descompacta-o e abre document.xml
  2. Verifica o XML para m:oMathPara elements
  3. Substitui-os por w:p elementos formatados
  4. Reduz o DOCX em /tmp
  5. Abre o DOCX resultante no LibreOffice
  6. Pergunta se o usuário deseja manter as alterações; se eles responderem sim, o DOCX transformado é copiado sobre o original para sobrescrevê-lo

Isso não foi testado muito, então você deve fazer backup de todos os arquivos que você usa apenas no caso. Observe que ele só funcionará no Linux e exigirá a instalação da ferramenta unzip . (É no universo se você não tiver: sudo apt install unzip .) Você pode precisar gem install nokogiri também.

    #!/usr/bin/ruby
# THIS IS LINUX ONLY!
# You'll also need to install 'unzip':
#     sudo apt install unzip

require "pp"
require "zip"
require "fileutils"
require "nokogiri"

def error(msg)
    puts msg
    exit
end

temp_dir = "/tmp/dispeqfix/"

filename = ARGV[0]

error "Please pass a filename as an argument." if filename.nil?

# Remove the directory if this tool has been run before
FileUtils.remove_dir(temp_dir) if Dir.exist? temp_dir

# Extract file as a zip
%x{unzip '#{filename}' -d '#{temp_dir}'}

# Get path to document.xml, the file we need to modify
document_path = "/tmp/dispeqfix/word/document.xml"
error "document.xml not found - are you sure this file is a DOCX?" unless File.exist? document_path

xml = Nokogiri::XML(File.read(document_path))

# 'm:oMathPara' is the element which LibreOffice doesn't support
xml.search("//m:oMathPara").each do |math_para|
    # Get the paragraph containing this one
    parent_para = math_para.parent

    # Get the 'm:oMath' contained within the 'm:oMathPara'
    math_para.dup.children.each do |math|
        # Insert a new paragraph with contains the 'm:oMath'
        new_para = Nokogiri::XML::Node.new("w:p", xml)
        math.parent = new_para
        parent_para.after(new_para)

        # Centre the paragraph
        math.before("<w:pPr><w:jc w:val=\"center\"/><w:rPr/></w:pPr><w:r><w:rPr/></w:r>")
    end

    math_para.remove
end

# Write this temporary file
File.write(document_path, xml.to_xml)

# Re-zip and open it
%x{ cd /tmp/dispeqfix; zip -r ../dispeqfix.docx * }
preview = spawn("libreoffice --writer /tmp/dispeqfix.docx 2>&1 > /dev/null", out: File::NULL)
Process.detach(preview)

# Prompt for overwrite
print "Would you like to overwrite the original document with this one? [y/n] "
if $stdin.gets.chomp == "y"
    %x{ cp -f /tmp/dispeqfix.docx #{filename} }
    puts "Overwritten."
else
    puts "No change made."
end
    
por Aaron Christiansen 27.02.2018 / 18:09