Skip to content

LuaTeX/PdfTeX: Trasparenza errata per i font con glifi sovrapposti -- ottenere un effetto simile a Adobe InDesign/Tikz in modalità testo

Dopo la nostra lunga selezione di informazioni siamo stati in grado di risolvere questa situazione che alcuni lettori presentano. Ti offriamo la soluzione e speriamo di esserti di grande aiuto.

Soluzione:

Questa non è una soluzione a questa domanda, e viene postata qui solo per mostrare ciò che si può ottenere con tikz/pgf (come indicato nella domanda).

Aggiornamento: risposta solo per PGF

Ecco una soluzione ottimizzata che utilizza solo pgf. Ha meno spese rispetto all'uso di tikz . Dopo averci pensato troppo a lungo, credo che questa sia la soluzione migliore in assoluto. È molto più semplice da implementare, funziona con altri pacchetti e ha un impatto minimo sulla velocità.

Le modalità di fusione sembrano inaffidabili in tutti i visualizzatori, a meno che non si faccia attenzione a come si dispone il testo nel file pgfpicturequindi non credo che ci sia nulla da guadagnare usandole.

%! TeX Program = lualatex

documentclass{article}

usepackage{xparse}
usepackage{pgf}

ExplSyntaxOn

NewDocumentEnvironment { transparencygroup }
  { m +b }
  {
    par
    dim_set_eq:NN l_tmpa_dim prevdepth
    noindent
    pgfrememberpicturepositiononpagefalse
    begin { pgfpicture }
      pgfsetfillopacity { #1 }
      begin { pgftransparencygroup } [ isolated=false ]
        pgfpathmoveto { pgfpointorigin }
        pgftext [ base ]
          {
            vbox:n
              {
                dim_set_eq:NN prevdepth l_tmpa_dim
                #2
              }
          }
      end { pgftransparencygroup }
    end { pgfpicture }
  }
  { }

NewDocumentCommand texttransparencygroup { m m }
  {
    mode_leave_vertical:
    hbox:n
      {
        pgfrememberpicturepositiononpagefalse
        begin { pgfpicture }
          pgfsetfillopacity { #1 }
          begin { pgftransparencygroup } [ isolated=true ]
            pgfpathmoveto { pgfpointorigin }
            pgftext [ base ] { #2 }
          end { pgftransparencygroup }
        end { pgfpicture }
      }
  }

ExplSyntaxOff

usepackage{fontspec}

newfontfamily{devanagari}{Noto Sans Devanagari}[Script=Devanagari, Renderer=HarfBuzz]

begin{document}

Huge
English {devanagari texttransparencygroup{0.4}{एक गांव में पिताजी}} English

devanagaricolor{red}
begin{transparencygroup}{0.5}
  एक गांव में पिताजी
end{transparencygroup}

vskip-8mm
color{green}
begin{transparencygroup}{0.25}
  एक गांव में पिताजी
end{transparencygroup}

end{document}

produzione


Risposta di TIKZ

Il vostro PDF da InDesign utilizza essenzialmente lo stesso metodo di tikz. Crea un Form XObject con un gruppo di trasparenza e vi inserisce il testo. Quindi inserisce questo Form XObject nel flusso della pagina. Anche se non si usa tikz, si dovrà comunque racchiudere il contenuto in un XObject. Il gruppo di trasparenza non è solo un flag grafico che si può attivare e disattivare a metà del flusso.

Il trucco con tikz sembra essere quello di mettere solo il testo nel gruppo di trasparenza:

    documentclass{article}
    usepackage{l3pdf}
    ExplSyntaxOn
    pdf_uncompress:
    ExplSyntaxOff
    usepackage{fontspec}
    usepackage{tikz}
    newfontfamily{devanagari}{Noto Sans Devanagari}[Script=Devanagari, Scale=1, Renderer=HarfBuzz]
    begin{document}
    begin{tikzpicture}[opacity=0.5]
      fill[cyan] (0,0) circle [radius=10pt];
      begin{scope}[transparency group]
        node[text=red, font=devanagari] {एक गांव में पिताजी};
      end{scope}
    end{tikzpicture}
    end{document}

produzione

Ecco un esempio più completo, che mostra come inserire un paio di paragrafi di colori diversi in un gruppo di trasparenza. Consente inoltre di specificare la modalità di fusione. Tuttavia, qualsiasi grafica di sfondo deve trovarsi nel gruppo di fusione. Questa non è una limitazione se si vuole solo la trasparenza.

documentclass{article}
usepackage{l3pdf}
ExplSyntaxOn
pdf_uncompress:
ExplSyntaxOff
usepackage{fontspec}
usepackage{tikz}
usepackage{lipsum}
newfontfamily{devanagari}{Noto Sans Devanagari}[Script=Devanagari, Scale=1, Renderer=HarfBuzz]
newcommand*{tgopacity}{0.5}
newcommand*{tgblendmode}{normal}
newcommand*{tggraphics}{}
% begin{transparentgroup}{opacity}{blend mode}{graphics within blend group}
newenvironment{transparentgroup}[3]{%
  renewcommand*{tgopacity}{#1}%
  renewcommand*{tgblendmode}{#2}%
  renewcommand{tggraphics}{#3}%
  setbox0=vboxbgroup
}{%
  egroup
  noindentbegin{tikzpicture}[
      inner sep=0pt, outer sep=0pt, blend group=tgblendmode
    ]
    tggraphics
    pgfresetboundingbox
    begin{scope}[transparency group, opacity=tgopacity]
      node [anchor=north west] {box0};
    end{scope}
  end{tikzpicture}}
begin{document}
noindenttikz[remember picture, overlay] fill[green, opacity=0.5]
  ([yshift=7cm]current page.center) circle [radius=20pt];%
begin{transparentgroup}{0.5}{lighten}{
    fill[green, opacity=0.5] (10mm,-5mm) circle [radius=20pt];
  }
  textcolor{red}{devanagari एक गांव में पिताजी}

  lipsum[1]
end{transparentgroup}

textcolor{red}{devanagari एक गांव में पिताजी}

lipsum[1]

end{document}

produzione

È possibile fare ciò che si vuole, ma è piuttosto complicato. L'esempio seguente presenta un'interfaccia semplice per impostare il materiale in un elemento vbox e consente di impostare l'opacità e la modalità di fusione.

L'utilizzo è:

begin{transparencygroup}[
    opacity = < Value between 0 and 1 >,
    blend mode = < One of the standard PDF blend modes >
  ]
end{transparencygroup}

A causa della scarsa interfaccia per le risorse di pagina, possono verificarsi problemi con
altri pacchetti che aggiungono elementi alle risorse di pagina.

Questo codice di esempio non fa alcun tentativo di lavorare con altri pacchetti, quindi è potrebbe non funzionare correttamente se sono stati caricati altri pacchetti che hanno problemi con /ExtGState (ad esempio, tikz, colorspace, transparent, fontspec, la funzione Opacità, ecc.) tikz fornisce un aggancio che può essere utilizzato se si ha bisogno di usare tikz.

%! TeX Program = lualatex

documentclass{article}
pagestyle{empty}

% grouped transparency implementation

% Limitations:
%
% 1. Because of the poor interface for page resources, there can be problems
%    with other packages that add things to the /ExtGState dictionary (e.g.,
%    tikz, colorspace, transparent, etc.).
%
% 2. You can't use the Opacity feature of fontspec as this puts the
%    transparency code inside the transparency group, and you'll still get the
%    overlapping glyphs.
%
% 3. Only LuaLaTeX is supported.

usepackage{l3pdf}
usepackage{xparse}
usepackage{everyshi}

ExplSyntaxOn

pdf_uncompress:

% l3pdf extensions (lualatex only)

cs_generate_variant:Nn pdf_object_new:nn { xn }
cs_generate_variant:Nn pdf_object_write:nn { xx }
cs_generate_variant:Nn pdf_object_ref:n { e }

cs_new_protected:Nn __reportaman_pdf_xform_now:Nnn
  {
    tex_immediate:D tex_pdfxform:D
      attr { #2 }
      resources { #3 }
      #1
  }
cs_generate_variant:Nn __reportaman_pdf_xform_now:Nnn { Nxx }

cs_new_protected:Nx __reportaman_pdf_xform_last:
  {
    exp_not:N int_value:w
    exp_not:N tex_pdflastxform:D
    c_space_tl 0 ~ R
  }

cs_new_protected:Nn __reportaman_pdf_refxform_last:
  {
    tex_pdfrefxform:D tex_pdflastxform:D
  }

cs_new_protected:Nn __reportaman_pdf_pageresources_gput_right:nn
  {
    tex_global:D
    tex_pdfvariable:D pageresources
    exp_after:wN
      {
        tex_the:D tex_pdfvariable:D pageresources / #1 ~ #2
      }
  }
cs_generate_variant:Nn __reportaman_pdf_pageresources_gput_right:nn { nx }

cs_new_protected:Nn __reportaman_pdf_literal_direct:n
  {
    tex_pdfextension:D literal direct
      {
        #1
      }
  }
cs_generate_variant:Nn __reportaman_pdf_literal_direct:n { x }

cs_new_protected:Nn __reportaman_pdf_save_gs:
  {
    __reportaman_pdf_literal_direct:n { q }
  }

cs_new_protected:Nn __reportaman_pdf_restore_gs:
  {
    __reportaman_pdf_literal_direct:n { Q }
  }

% grouped transparency back end

clist_new:N g__reportaman_ca_clist
clist_new:N g__reportaman_bm_clist
int_new:N g__reportaman_extgstate_int

cs_new_protected:Nn __reportaman_set_pdf_page_resources:
  {
    clist_remove_duplicates:N g__reportaman_ca_clist
    clist_remove_duplicates:N g__reportaman_bm_clist
    tl_clear:N l_tmpa_tl
    clist_map_inline:Nn g__reportaman_ca_clist
      {
        tl_put_right:Nn l_tmpa_tl
          {
            /reportaman_CA_##1 ~ << ~ /CA ~ ##1 ~ >> ~
            /reportaman_ca_##1 ~ << ~ /ca ~ ##1 ~ >> ~
          }
      }
    clist_map_inline:Nn g__reportaman_bm_clist
      {
        tl_put_right:Nn l_tmpa_tl
          {
            /reportaman_bm_##1 ~ << ~ /BM ~ [ ~ /##1 ~ ] ~ >> ~
          }
      }
    clist_gclear:N g__reportaman_ca_clist
    clist_gclear:N g__reportaman_bm_clist
    exp_args:Nx pdf_object_if_exist:nT
      {
        reportaman_extgstate_ int_use:N g__reportaman_extgstate_int
      }
      {
        pdf_object_write:xx
          { reportaman_extgstate_ int_use:N g__reportaman_extgstate_int }
          { l_tmpa_tl }
        __reportaman_pdf_pageresources_gput_right:nx
          { ExtGState }
          { 
            pdf_object_ref:e
              {
                reportaman_extgstate_ int_use:N g__reportaman_extgstate_int
              }
          }
        int_gincr:N g__reportaman_extgstate_int
      }
  }

EveryShipout { __reportaman_set_pdf_page_resources: }

keys_define:nn { reportaman }
{
  opacity      .tl_set:N           = l__reportaman_opacity_tl,
  opacity      .value_required:n   = true,
  blend ~ mode .choice:,
  blend ~ mode .choices:nn         =
    { Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge,
      ColorBurn, HardLight, SoftLight, Difference, Exclusion, Hue, Saturation,
      Color, Luminosity }
    { tl_set_eq:NN l__reportaman_blend_mode_tl l_keys_choice_tl },
  blend ~ mode .value_required:n   = true,
}

% grouped transparency front end
% begin{transparencygroup}[
%   opacity = < Value between 0 and 1 >,
%   blend mode = < One of the standard PDF blend modes >
% ]
% end{transparencygroup}
NewDocumentEnvironment { transparentgroup }
  { o +b }
  {
    keys_set:nn { reportaman }
      {
        opacity = { 1 },
        blend ~ mode = { Normal }
      }
    IfValueT { #1 }
      {
        keys_set:nn { reportaman } { #1 }
      }
    clist_gput_right:Nx g__reportaman_ca_clist { l__reportaman_opacity_tl }
    clist_gput_right:Nx g__reportaman_bm_clist { l__reportaman_blend_mode_tl }
    vbox_set:Nn l_tmpa_box
      {
        __reportaman_pdf_literal_direct:x
          {
            /reportaman_bm_l__reportaman_blend_mode_tl c_space_tl gs
          }
        #2
      }
    exp_args:Nx pdf_object_if_exist:nF
      {
        reportaman_extgstate_ int_use:N g__reportaman_extgstate_int
      }
      {
        pdf_object_new:xn
          { reportaman_extgstate_ int_use:N g__reportaman_extgstate_int }
          { dict }
      }
    __reportaman_pdf_xform_now:Nxx
      l_tmpa_box
      { /Group ~ << ~ /S ~ /Transparency ~ /I ~ true ~ /K ~ false ~ >> }
      { /ExtGState ~
        pdf_object_ref:e
        {
          reportaman_extgstate_ int_use:N g__reportaman_extgstate_int
        }
      }
    __reportaman_pdf_save_gs:
    __reportaman_pdf_literal_direct:x
      {
        /reportaman_CA_l__reportaman_opacity_tl c_space_tl gs iow_newline:
        /reportaman_ca_l__reportaman_opacity_tl c_space_tl gs
      }
    __reportaman_pdf_refxform_last:
    __reportaman_pdf_restore_gs:
  }
  {
  }

ExplSyntaxOff

% Usage example

usepackage{xcolor}
usepackage{fontspec}
newfontfamily{devanagari}{Noto Sans Devanagari}[Script=Devanagari, Scale=1, Renderer=HarfBuzz]

begin{document}
begin{transparentgroup}[opacity=0.25, blend mode=Hue]
  devanagariHuge
  color{red}एक गांव में पिताजी

  vspace{-7mm}quad
  color{green}एक गांव में पिताजी
end{transparentgroup}

begin{transparentgroup}[opacity=0.5]
  devanagariHuge
  color{red}एक गांव में पिताजी

  vspace{-7mm}quad
  color{blue}एक गांव में पिताजी
end{transparentgroup}

begin{transparentgroup}
  devanagariHuge
  color{red}एक गांव में पिताजी

  vspace{-7mm}quad
  color{yellow}एक गांव में पिताजी
end{transparentgroup}
end{document}

produzione

Se il nostro post ti è stato utile, sarebbe molto utile se lo condividessi con altri sviluppatori in questo modo per aiutare a diffondere le nostre informazioni.



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.