Officedown: El marcador \@ref no funciona para cadenas de varios bytes

Creado en 27 ago. 2020  ·  7Comentarios  ·  Fuente: davidgohel/officedown

Supongamos que tengo un archivo .Rmd como el siguiente:

---
title: "Untitled"
output:
  officedown::rdocx_document:
    default
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)



md5-4caffc4710057148fdad652000287a10



# Chapter1 {#ch1}

# Chapter2 {#ch2}

Refer to \@ref(ch1).

Cuando \@ref (ch1) está rodeado de cadenas de varios bytes (por ejemplo, caracteres chinos), es posible que encuentre errores.

  • Multibyte puro + referencia

    • Ejemplo: 上下\@ref(ch1)
    • resultado: correcto
  • Mixto multibyte/monobyte + ref

    • Ejemplo: 上a下\@ref(ch1)
    • Resultado: incorrecto (上a下@ref (ch1))
  • referencia + multibyte

    • Ejemplo: \@ref(ch1)。
    • Resultado: compilación fallida


    Error en nchar(u, tipo): cadena multibyte no válida, elemento 1

    Llamadas:... regmatches<- -> regmatches -> Mapa -> mapply ->



¿Puedes por favor investigar este problema? Gracias.


sessionInfo()

R versión 4.0.2 (2020-06-22)
Plataforma: x86_64-w64-mingw32/x64 (64 bits)
Ejecutándose bajo: Windows 10 x64 (compilación 20180)

Productos Matrix: por defecto

lugar:
[1] LC_COLLATE=Chino (simplificado)_China.936
[2] LC_CTYPE=Chino (simplificado)_China.936
[3] LC_MONETARY=Chino (simplificado)_China.936
[4] LC_NUMERICO=C
[5] LC_TIME=Chino (simplificado)_China.936

Paquetes básicos adjuntos:
[1] estadísticas gráficos grDevices utils conjuntos de datos métodos
[7] base

otros paquetes adjuntos:
[1] oficial_0.3.12 officedown_0.2.0 flextable_0.5.10
[4] ggplot2_3.3.2 tidyr_1.1.1 knitr_1.29
[7] dplyr_1.0.2 reticulado_1.16

cargado a través de un espacio de nombres (y no adjunto):
[1] Rcpp_1.0.5 lattice_0.20-41 unidades bonitas_1.1.1
[4] sysfonts_0.8.1 ps_1.3.4 utf8_1.1.4
[7] rprojroot_1.3-2 afirmar que_0.2.1 digest_0.6.25
[10] R6_2.4.1 backports_1.1.9 evaluar_0.14
[13] pilar_1.4.6 gdtools_0.2.2 rlang_0.4.7
[16] curl_4.3 uuid_0.1-4 datos.tabla_1.13.0
[19] callr_3.4.3 Matrix_1.2-18 rmarkdown_2.3
[22] desc_1.2.0 etiquetado_0.3 devtools_2.3.1
[25] stringr_1.4.0 munsell_0.5.0 tinytex_0.25
[28] compilador_4.0.2 xfun_0.16 pkgconfig_2.0.3
[31] systemfonts_0.2.3 base64enc_0.1-3 pkgbuild_1.1.0
[34] rvg_0.2.5 htmltools_0.5.0 tidyselect_1.1.0
[37] tibble_3.0.3 bookdown_0.20 fansi_0.4.1
[40] crayon_1.3.4 showtextdb_3.0 withr_2.2.0
[43] grid_4.0.2 jsonlite_1.7.0 gtable_0.3.0
[46] ciclo de vida_0.2.0 magrittr_1.5 escalas_1.1.1
[49] zip_2.1.0 cli_2.0.2 stringi_1.4.6
[52] farver_2.0.3 fs_1.5.0 remotos_2.2.0
[55] testthat_2.3.2 xml2_1.3.2 puntos suspensivos_0.3.1
[58] genéricos_0.0.2 vctrs_0.3.2 herramientas_4.0.2
[61] showtext_0.9 pegamento_1.4.1 purrr_0.3.4
[64] procesox_3.4.3 pkgload_1.1.0 yaml_2.2.1
[67] colorspace_1.4-1 sessioninfo_1.1.1 memoise_1.1.0
[70] usethis_1.6.1

bug

Todos 7 comentarios

```````


título: "Sin título"
producción:
officedown::rdocx_document:

defecto

{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE)

Capítulo 1 {#ch1}

Capítulo 2 {#ch2}

Consulte @ref (ch1).

Cuando @ref (ch1) está rodeado de cadenas de varios bytes (por ejemplo, caracteres chinos), es posible que encuentre errores.

Su problema está relacionado con el hecho de que no está trabajando con un archivo codificado en UTF-8.

R, R Markdown y Windows no funcionan bien cuando la codificación no es UTF-8.

Capture d’écran 2020-08-27 à 10 53 27

Sin titulo.docx

Sí, @davidgohel , tienes razón. Aunque el archivo .Rmd está en UTF-8, el sistema operativo se ejecuta en codificación GBK. Cuando cambio a bookdown::word_document2 , el motor knitr logra compilar el archivo. Pero todavía tengo ?? donde se supone que debe aparecer el marcador.

No necesita probar nuevas funciones de formato de salida.

El resultado que se muestra a continuación está hecho con Windows con configuración regional francesa. Pero me aseguré de que el archivo estuviera codificado como UTF-8 (estoy usando readr::guess_encoding() , si no está codificado en UTF-8, puedo cambiarlo a UTF8 con fpeek::peek_iconv() ).

¿Podrías mostrar el resultado de

readr::guess_encoding("your/rmd/file")

los resultados son

no | codificación | confianza
---|-------------|-----------:
1 | UTF-8 | 1
2 | ventanas-1252 | 0.28

Hola @madlogos ,

También soy un usuario chino. El problema de los multibytes también me ha molestado durante mucho tiempo. Aquí está mi truco para ello:

  1. Escriba @ref como de costumbre;
  2. Guarde el archivo Rmd y readr::read_lines ;
  3. Haga coincidir las cadenas que contienen el patrón "\\\\@ref\\([^\\)]+\\)" ;
  4. Divídalo y asegúrese de que los "\\\\@ref\\([^\\)]+\\)" en una sola línea;
  5. Guarde el vector de caracteres en un nuevo archivo Rmd y reprodúzcalo con el formato que desee. ¡Hecho!

Por ejemplo, 请参考表\@ref(tab: coco)中的数据 debe dividirse como
[línea 1] 请参考表
[línea 2] \@ref(tab: coco)
[línea 3] 中的数据

Bueno, no estoy seguro de si esta es una solución efectiva, pero funciona para mí. 😄

@bishun945 gracias por el cambio. Buen material.

@madlogos He probado otra solución: simplemente cambie su sistema y el idioma de MS Word a inglés.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

CLRafaelR picture CLRafaelR  ·  7Comentarios

CLRafaelR picture CLRafaelR  ·  6Comentarios

hmeleiro picture hmeleiro  ·  7Comentarios

evanmascitti picture evanmascitti  ·  3Comentarios

hadley picture hadley  ·  3Comentarios