1
+ <!DOCTYPE html>
2
+ < html xmlns ="http://www.w3.org/1999/xhtml " lang ="en " xml:lang ="en "> < head >
3
+
4
+ < meta charset ="utf-8 ">
5
+ < meta name ="generator " content ="quarto-1.3.450 ">
6
+
7
+ < meta name ="viewport " content ="width=device-width, initial-scale=1.0, user-scalable=yes ">
8
+
9
+
10
+ < title > readme</ title >
11
+ < style >
12
+ code {white-space : pre-wrap;}
13
+ span .smallcaps {font-variant : small-caps;}
14
+ div .columns {display : flex; gap : min (4vw , 1.5em );}
15
+ div .column {flex : auto; overflow-x : auto;}
16
+ div .hanging-indent {margin-left : 1.5em ; text-indent : -1.5em ;}
17
+ ul .task-list {list-style : none;}
18
+ ul .task-list li input [type = "checkbox" ] {
19
+ width : 0.8em ;
20
+ margin : 0 0.8em 0.2em -1em ; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */
21
+ vertical-align : middle;
22
+ }
23
+ </ style >
24
+
25
+
26
+ < script src ="README_files/libs/clipboard/clipboard.min.js "> </ script >
27
+ < script src ="README_files/libs/quarto-html/quarto.js "> </ script >
28
+ < script src ="README_files/libs/quarto-html/popper.min.js "> </ script >
29
+ < script src ="README_files/libs/quarto-html/tippy.umd.min.js "> </ script >
30
+ < script src ="README_files/libs/quarto-html/anchor.min.js "> </ script >
31
+ < link href ="README_files/libs/quarto-html/tippy.css " rel ="stylesheet ">
32
+ < link href ="README_files/libs/quarto-html/quarto-syntax-highlighting.css " rel ="stylesheet " id ="quarto-text-highlighting-styles ">
33
+ < script src ="README_files/libs/bootstrap/bootstrap.min.js "> </ script >
34
+ < link href ="README_files/libs/bootstrap/bootstrap-icons.css " rel ="stylesheet ">
35
+ < link href ="README_files/libs/bootstrap/bootstrap.min.css " rel ="stylesheet " id ="quarto-bootstrap " data-mode ="light ">
36
+
37
+
38
+ </ head >
39
+
40
+ < body class ="fullcontent ">
41
+
42
+ < div id ="quarto-content " class ="page-columns page-rows-contents page-layout-article ">
43
+
44
+ < main class ="content " id ="quarto-document-content ">
45
+
46
+
47
+
48
+ < section id ="working-in-progress " class ="level1 ">
49
+ < h1 > Working in progress</ h1 >
50
+ < p > Article repository “PLS-SEM Interactive Tutorial: Step-by-Step with cSEM package”.</ p >
51
+ </ section >
52
+ < section id ="license " class ="level1 ">
53
+ < h1 > License</ h1 >
54
+ < p xmlns:cc ="http://creativecommons.org/ns# ">
55
+ This work is licensed under < a href ="http://creativecommons.org/licenses/by-nc/4.0/?ref=chooser-v1 " target ="_blank " rel ="license noopener noreferrer " style ="display:inline-block; "> Attribution-NonCommercial 4.0 International< img style ="height:22px!important;margin-left:3px;vertical-align:text-bottom; " src ="https://mirrors.creativecommons.org/presskit/icons/cc.svg?ref=chooser-v1 "> < img style ="height:22px!important;margin-left:3px;vertical-align:text-bottom; " src ="https://mirrors.creativecommons.org/presskit/icons/by.svg?ref=chooser-v1 "> < img style ="height:22px!important;margin-left:3px;vertical-align:text-bottom; " src ="https://mirrors.creativecommons.org/presskit/icons/nc.svg?ref=chooser-v1 "> </ a >
56
+ </ p >
57
+ </ section >
58
+
59
+ </ main >
60
+ <!-- /main column -->
61
+ < script id ="quarto-html-after-body " type ="application/javascript ">
62
+ window . document . addEventListener ( "DOMContentLoaded" , function ( event ) {
63
+ const toggleBodyColorMode = ( bsSheetEl ) => {
64
+ const mode = bsSheetEl . getAttribute ( "data-mode" ) ;
65
+ const bodyEl = window . document . querySelector ( "body" ) ;
66
+ if ( mode === "dark" ) {
67
+ bodyEl . classList . add ( "quarto-dark" ) ;
68
+ bodyEl . classList . remove ( "quarto-light" ) ;
69
+ } else {
70
+ bodyEl . classList . add ( "quarto-light" ) ;
71
+ bodyEl . classList . remove ( "quarto-dark" ) ;
72
+ }
73
+ }
74
+ const toggleBodyColorPrimary = ( ) => {
75
+ const bsSheetEl = window . document . querySelector ( "link#quarto-bootstrap" ) ;
76
+ if ( bsSheetEl ) {
77
+ toggleBodyColorMode ( bsSheetEl ) ;
78
+ }
79
+ }
80
+ toggleBodyColorPrimary ( ) ;
81
+ const icon = "" ;
82
+ const anchorJS = new window . AnchorJS ( ) ;
83
+ anchorJS . options = {
84
+ placement : 'right' ,
85
+ icon : icon
86
+ } ;
87
+ anchorJS . add ( '.anchored' ) ;
88
+ const isCodeAnnotation = ( el ) => {
89
+ for ( const clz of el . classList ) {
90
+ if ( clz . startsWith ( 'code-annotation-' ) ) {
91
+ return true ;
92
+ }
93
+ }
94
+ return false ;
95
+ }
96
+ const clipboard = new window . ClipboardJS ( '.code-copy-button' , {
97
+ text : function ( trigger ) {
98
+ const codeEl = trigger . previousElementSibling . cloneNode ( true ) ;
99
+ for ( const childEl of codeEl . children ) {
100
+ if ( isCodeAnnotation ( childEl ) ) {
101
+ childEl . remove ( ) ;
102
+ }
103
+ }
104
+ return codeEl . innerText ;
105
+ }
106
+ } ) ;
107
+ clipboard . on ( 'success' , function ( e ) {
108
+ // button target
109
+ const button = e . trigger ;
110
+ // don't keep focus
111
+ button . blur ( ) ;
112
+ // flash "checked"
113
+ button . classList . add ( 'code-copy-button-checked' ) ;
114
+ var currentTitle = button . getAttribute ( "title" ) ;
115
+ button . setAttribute ( "title" , "Copied!" ) ;
116
+ let tooltip ;
117
+ if ( window . bootstrap ) {
118
+ button . setAttribute ( "data-bs-toggle" , "tooltip" ) ;
119
+ button . setAttribute ( "data-bs-placement" , "left" ) ;
120
+ button . setAttribute ( "data-bs-title" , "Copied!" ) ;
121
+ tooltip = new bootstrap . Tooltip ( button ,
122
+ { trigger : "manual" ,
123
+ customClass : "code-copy-button-tooltip" ,
124
+ offset : [ 0 , - 8 ] } ) ;
125
+ tooltip . show ( ) ;
126
+ }
127
+ setTimeout ( function ( ) {
128
+ if ( tooltip ) {
129
+ tooltip . hide ( ) ;
130
+ button . removeAttribute ( "data-bs-title" ) ;
131
+ button . removeAttribute ( "data-bs-toggle" ) ;
132
+ button . removeAttribute ( "data-bs-placement" ) ;
133
+ }
134
+ button . setAttribute ( "title" , currentTitle ) ;
135
+ button . classList . remove ( 'code-copy-button-checked' ) ;
136
+ } , 1000 ) ;
137
+ // clear code selection
138
+ e . clearSelection ( ) ;
139
+ } ) ;
140
+ function tippyHover ( el , contentFn ) {
141
+ const config = {
142
+ allowHTML : true ,
143
+ content : contentFn ,
144
+ maxWidth : 500 ,
145
+ delay : 100 ,
146
+ arrow : false ,
147
+ appendTo : function ( el ) {
148
+ return el . parentElement ;
149
+ } ,
150
+ interactive : true ,
151
+ interactiveBorder : 10 ,
152
+ theme : 'quarto' ,
153
+ placement : 'bottom-start'
154
+ } ;
155
+ window . tippy ( el , config ) ;
156
+ }
157
+ const noterefs = window . document . querySelectorAll ( 'a[role="doc-noteref"]' ) ;
158
+ for ( var i = 0 ; i < noterefs . length ; i ++ ) {
159
+ const ref = noterefs [ i ] ;
160
+ tippyHover ( ref , function ( ) {
161
+ // use id or data attribute instead here
162
+ let href = ref . getAttribute ( 'data-footnote-href' ) || ref . getAttribute ( 'href' ) ;
163
+ try { href = new URL ( href ) . hash ; } catch { }
164
+ const id = href . replace ( / ^ # \/ ? / , "" ) ;
165
+ const note = window . document . getElementById ( id ) ;
166
+ return note . innerHTML ;
167
+ } ) ;
168
+ }
169
+ let selectedAnnoteEl ;
170
+ const selectorForAnnotation = ( cell , annotation ) => {
171
+ let cellAttr = 'data-code-cell="' + cell + '"' ;
172
+ let lineAttr = 'data-code-annotation="' + annotation + '"' ;
173
+ const selector = 'span[' + cellAttr + '][' + lineAttr + ']' ;
174
+ return selector ;
175
+ }
176
+ const selectCodeLines = ( annoteEl ) => {
177
+ const doc = window . document ;
178
+ const targetCell = annoteEl . getAttribute ( "data-target-cell" ) ;
179
+ const targetAnnotation = annoteEl . getAttribute ( "data-target-annotation" ) ;
180
+ const annoteSpan = window . document . querySelector ( selectorForAnnotation ( targetCell , targetAnnotation ) ) ;
181
+ const lines = annoteSpan . getAttribute ( "data-code-lines" ) . split ( "," ) ;
182
+ const lineIds = lines . map ( ( line ) => {
183
+ return targetCell + "-" + line ;
184
+ } )
185
+ let top = null ;
186
+ let height = null ;
187
+ let parent = null ;
188
+ if ( lineIds . length > 0 ) {
189
+ //compute the position of the single el (top and bottom and make a div)
190
+ const el = window . document . getElementById ( lineIds [ 0 ] ) ;
191
+ top = el . offsetTop ;
192
+ height = el . offsetHeight ;
193
+ parent = el . parentElement . parentElement ;
194
+ if ( lineIds . length > 1 ) {
195
+ const lastEl = window . document . getElementById ( lineIds [ lineIds . length - 1 ] ) ;
196
+ const bottom = lastEl . offsetTop + lastEl . offsetHeight ;
197
+ height = bottom - top ;
198
+ }
199
+ if ( top !== null && height !== null && parent !== null ) {
200
+ // cook up a div (if necessary) and position it
201
+ let div = window . document . getElementById ( "code-annotation-line-highlight" ) ;
202
+ if ( div === null ) {
203
+ div = window . document . createElement ( "div" ) ;
204
+ div . setAttribute ( "id" , "code-annotation-line-highlight" ) ;
205
+ div . style . position = 'absolute' ;
206
+ parent . appendChild ( div ) ;
207
+ }
208
+ div . style . top = top - 2 + "px" ;
209
+ div . style . height = height + 4 + "px" ;
210
+ let gutterDiv = window . document . getElementById ( "code-annotation-line-highlight-gutter" ) ;
211
+ if ( gutterDiv === null ) {
212
+ gutterDiv = window . document . createElement ( "div" ) ;
213
+ gutterDiv . setAttribute ( "id" , "code-annotation-line-highlight-gutter" ) ;
214
+ gutterDiv . style . position = 'absolute' ;
215
+ const codeCell = window . document . getElementById ( targetCell ) ;
216
+ const gutter = codeCell . querySelector ( '.code-annotation-gutter' ) ;
217
+ gutter . appendChild ( gutterDiv ) ;
218
+ }
219
+ gutterDiv . style . top = top - 2 + "px" ;
220
+ gutterDiv . style . height = height + 4 + "px" ;
221
+ }
222
+ selectedAnnoteEl = annoteEl ;
223
+ }
224
+ } ;
225
+ const unselectCodeLines = ( ) => {
226
+ const elementsIds = [ "code-annotation-line-highlight" , "code-annotation-line-highlight-gutter" ] ;
227
+ elementsIds . forEach ( ( elId ) => {
228
+ const div = window . document . getElementById ( elId ) ;
229
+ if ( div ) {
230
+ div . remove ( ) ;
231
+ }
232
+ } ) ;
233
+ selectedAnnoteEl = undefined ;
234
+ } ;
235
+ // Attach click handler to the DT
236
+ const annoteDls = window . document . querySelectorAll ( 'dt[data-target-cell]' ) ;
237
+ for ( const annoteDlNode of annoteDls ) {
238
+ annoteDlNode . addEventListener ( 'click' , ( event ) => {
239
+ const clickedEl = event . target ;
240
+ if ( clickedEl !== selectedAnnoteEl ) {
241
+ unselectCodeLines ( ) ;
242
+ const activeEl = window . document . querySelector ( 'dt[data-target-cell].code-annotation-active' ) ;
243
+ if ( activeEl ) {
244
+ activeEl . classList . remove ( 'code-annotation-active' ) ;
245
+ }
246
+ selectCodeLines ( clickedEl ) ;
247
+ clickedEl . classList . add ( 'code-annotation-active' ) ;
248
+ } else {
249
+ // Unselect the line
250
+ unselectCodeLines ( ) ;
251
+ clickedEl . classList . remove ( 'code-annotation-active' ) ;
252
+ }
253
+ } ) ;
254
+ }
255
+ const findCites = ( el ) => {
256
+ const parentEl = el . parentElement ;
257
+ if ( parentEl ) {
258
+ const cites = parentEl . dataset . cites ;
259
+ if ( cites ) {
260
+ return {
261
+ el,
262
+ cites : cites . split ( ' ' )
263
+ } ;
264
+ } else {
265
+ return findCites ( el . parentElement )
266
+ }
267
+ } else {
268
+ return undefined ;
269
+ }
270
+ } ;
271
+ var bibliorefs = window . document . querySelectorAll ( 'a[role="doc-biblioref"]' ) ;
272
+ for ( var i = 0 ; i < bibliorefs . length ; i ++ ) {
273
+ const ref = bibliorefs [ i ] ;
274
+ const citeInfo = findCites ( ref ) ;
275
+ if ( citeInfo ) {
276
+ tippyHover ( citeInfo . el , function ( ) {
277
+ var popup = window . document . createElement ( 'div' ) ;
278
+ citeInfo . cites . forEach ( function ( cite ) {
279
+ var citeDiv = window . document . createElement ( 'div' ) ;
280
+ citeDiv . classList . add ( 'hanging-indent' ) ;
281
+ citeDiv . classList . add ( 'csl-entry' ) ;
282
+ var biblioDiv = window . document . getElementById ( 'ref-' + cite ) ;
283
+ if ( biblioDiv ) {
284
+ citeDiv . innerHTML = biblioDiv . innerHTML ;
285
+ }
286
+ popup . appendChild ( citeDiv ) ;
287
+ } ) ;
288
+ return popup . innerHTML ;
289
+ } ) ;
290
+ }
291
+ }
292
+ } ) ;
293
+ </ script >
294
+ </ div > <!-- /content -->
295
+
296
+
297
+
298
+ </ body > </ html >
0 commit comments