diff --git a/.Rbuildignore b/.Rbuildignore index 0b21ee8..d2f118f 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -16,3 +16,4 @@ appveyor.yml ^cran-comments.md ^CODE_OF_CONDUCT\.md$ ^\.github$ +^CRAN-SUBMISSION$ diff --git a/ChangeLog b/ChangeLog index fd9485c..c226f1f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,6 @@ ChangeLog for networkDynamic package +v 0.3.6 update doc links and urls as requested by cran +v 0.3.5 update doc links as requested by cran v 0.3.4 update to test to work with upcoming testthat upgrade v 0.3.3 - CRAN-requested update to fix NOTEs about url redirects diff --git a/DESCRIPTION b/DESCRIPTION index da21fad..8e337f7 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: tsna -Version: 0.3.5 -Date: 2021-10-31 +Version: 0.3.6 +Date: 2025-05-04 Title: Tools for Temporal Social Network Analysis Type: Package Authors@R: c( @@ -14,6 +14,6 @@ Suggests: networkDynamicData, testthat, sna, knitr, rmarkdown, relevent, ergm (> Description: Temporal SNA tools for continuous- and discrete-time longitudinal networks having vertex, edge, and attribute dynamics stored in the 'networkDynamic' format. This work was supported by grant R01HD68395 from the National Institute of Health. License: GPL-3 LazyLoad: yes -URL: http://statnet.org/ +URL: https://statnet.org/ BugReports: https://github.com/statnet/tsna/issues VignetteBuilder: knitr diff --git a/README.md b/README.md index fa86543..831cf86 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # `tsna`: Tools for Temporal Social Network Analysis [![rstudio mirror downloads](https://cranlogs.r-pkg.org/badges/tsna?color=2ED968)](https://cranlogs.r-pkg.org/) -[![cran version](https://www.r-pkg.org/badges/version/ergm)](https://cran.r-project.org/package=tsna) -[![Coverage status](https://codecov.io/gh/statnet/ergm/branch/master/graph/badge.svg)](https://codecov.io/github/statnet/tsna?branch=master) +[![cran version](https://www.r-pkg.org/badges/version/tsna)](https://cran.r-project.org/package=tsna) +[![Coverage status](https://app.codecov.io/gh/statnet/tsna/branch/master/graph/badge.svg)](https://app.codecov.io/github/statnet/tsna?branch=master) [![R build status](https://github.com/statnet/tsna/workflows/R-CMD-check/badge.svg)](https://github.com/statnet/tsna/actions) -This package provides tools for exploring and describing longitudinal network data. It works with temporal network data that is stored as a `networkDynamic` object -- essentially a list in the `network` format in which elements also have an attached activity attribute, a matrix of spells indicating when vertex or edge is active. See the [networkDynamic](https://cran.r-project.org/web/packages/networkDynamic/index.html) package for more information on translating longitudinal network data from other formats (timed edge lists, lists of toggles, sets of matrices, etc). +This package provides tools for exploring and describing longitudinal network data. It works with temporal network data that is stored as a `networkDynamic` object -- essentially a list in the `network` format in which elements also have an attached activity attribute, a matrix of spells indicating when vertex or edge is active. See the [networkDynamic](https://CRAN.R-project.org/package=networkDynamic) package for more information on translating longitudinal network data from other formats (timed edge lists, lists of toggles, sets of matrices, etc). The `tsna` package contains functions for calculating a range of descriptive statistics from longitudinal network data. Some of these are simple temporal extensions of static network descriptors, others are unique to longitudinal network data. @@ -13,8 +13,8 @@ The `tsna` package contains functions for calculating a range of descriptive sta These functions operate by collapsing the dynamic network into a static network at a series of regular intervals and returning the results as a time series ts object. They can provide general description of trends in a network dataset. - - `tSnaStats` – descriptive statistics from the [sna](https://cran.r-project.org/web/packages/ergm/index.html) package. Includes both graph- and vertex-level measures such as centralities, components, reciprocity, betweenness, triad-census, etc. - - `tErgmStats` – descriptive statistics for the "terms" used in statistical Exponential-family Random Graph Models (ERGMs) from the [ergm package](https://cran.r-project.org/web/packages/ergm/index.html) + - `tSnaStats` – descriptive statistics from the [sna](https://CRAN.R-project.org/package=sna) package. Includes both graph- and vertex-level measures such as centralities, components, reciprocity, betweenness, triad-census, etc. + - `tErgmStats` – descriptive statistics for the "terms" used in statistical Exponential-family Random Graph Models (ERGMs) from the [ergm package](https://CRAN.R-project.org/package=ergm) * Temporal path based metrics @@ -48,14 +48,14 @@ The development of this software was supported by grant R01HD68395 from the Nati ## Docs and examples -The [package vignette](https://cran.r-project.org/web/packages/tsna/vignettes/tsna_vignette.html) (`browseVignettes(package='tsna')`) provides examples and illustrations of key concepts. +The [package vignette](https://cran.r-project.org/package=tsna/vignettes/tsna_vignette.html) (`browseVignettes(package='tsna')`) provides examples and illustrations of key concepts. Examples of how `tsna` tools might be used in a network data analysis workflow can be found in our [Workshop materials](https://statnet.org/workshops/), in particular the [Temporal network tools](https://statnet.org/workshop-ndtv/) and [tergm](https://statnet.org/workshop-tergm/) workshops. ## License and attribution -This software is distributed under the GPL-3 license. It is free, open source, and has the attribution requirements (GPL Section 7) at http://statnet.org/attribution +This software is distributed under the GPL-3 license. It is free, open source, and has the attribution requirements (GPL Section 7) at https://statnet.org/attribution To cite package ‘tsna’ in publications please use: Bender-deMoll S, Morris M (2021). _tsna: Tools for Temporal Social Network Analysis_. R package version 0.3.5, . diff --git a/man/density.Rd b/man/density.Rd index 91f3345..7ae1d6e 100644 --- a/man/density.Rd +++ b/man/density.Rd @@ -22,7 +22,7 @@ tEdgeDensity(nd,mode=c('duration','event'), %- maybe also 'usage' for other objects documented here. \arguments{ \item{nd}{ - a \code{\link{networkDynamic}} object to evaluate density on + a \code{\link[networkDynamic]{networkDynamic}} object to evaluate density on } \item{mode}{ option indicating if \code{'duration'} of edge spells should be considered or only the \code{'event'} count (for networks in which events have zero-durations) diff --git a/man/durations.Rd b/man/durations.Rd index faac2e7..5b5c44b 100644 --- a/man/durations.Rd +++ b/man/durations.Rd @@ -44,17 +44,17 @@ option describing the unit of analysis that the durations or counts should be ag numeric vector of vertex ids to consider. } \item{start}{ -optional numeric value to be used to censor onset times. (not yet supported for vertices, must use \code{\link{net.obs.period}} instead.) +optional numeric value to be used to censor onset times. (not yet supported for vertices, must use \code{\link[networkDynamic]{net.obs.period}} instead.) } \item{end}{ -optional numeric value to be used to censor terminus times. (not yet supported for vertices, must use \code{\link{net.obs.period}} instead.) +optional numeric value to be used to censor terminus times. (not yet supported for vertices, must use \code{\link[networkDynamic]{net.obs.period}} instead.) } \item{active.default}{ logial, should edges or vertices with no timing information be considered always active by default? } } \details{ - The function sums the durations of edge or vertex events or,in order to provide a useful metric for networks having zero-duration events, simply counts them. It is implemented by wrapping a call to \code{\link{as.data.frame.networkDynamic}} or \code{\link{get.vertex.activity}}. In many cases the output of the function will be fed to another statistical summary function like \code{summary} or \code{hist}. The level of aggregation can be selected by setting the subject to either \code{spells}, \code{edges}, or \code{dyads}. + The function sums the durations of edge or vertex events or,in order to provide a useful metric for networks having zero-duration events, simply counts them. It is implemented by wrapping a call to \code{\link[networkDynamic]{as.data.frame.networkDynamic}} or \code{\link[networkDynamic]{get.vertex.activity}}. In many cases the output of the function will be fed to another statistical summary function like \code{summary} or \code{hist}. The level of aggregation can be selected by setting the subject to either \code{spells}, \code{edges}, or \code{dyads}. Note that the 'observed' durations may not match the 'true' (statistically estimated) durations for a network due to the censoring of edges/vertices. } @@ -71,7 +71,7 @@ This is an early implementation of the function and its name and arguments are s \seealso{ -See also \code{\link{as.data.frame.networkDynamic}} +See also \code{\link[networkDynamic]{as.data.frame.networkDynamic}} } \examples{ diff --git a/man/incidence.Rd b/man/incidence.Rd index 5a74aba..5ce0cd2 100644 --- a/man/incidence.Rd +++ b/man/incidence.Rd @@ -6,7 +6,7 @@ Counts or fractions of edge transitions in a networkDynamic object } \description{ -The functions \code{tEdgeFormation} and \code{tEdgeDissolution} evaluate a network object at multiple time points and return counts (or fractions) of the number of edges forming (edge onset at time point) and dissolving (edge terminus at time point). The counts are returned as numeric vector which is a time-series object (class \code{\link{ts}}). +The functions \code{tEdgeFormation} and \code{tEdgeDissolution} evaluate a network object at multiple time points and return counts (or fractions) of the number of edges forming (edge onset at time point) and dissolving (edge terminus at time point). The counts are returned as numeric vector which is a time-series object (class \code{{ts}}). } \usage{ @@ -20,7 +20,7 @@ tEdgeDissolution(nd, start, end, time.interval = 1, %- maybe also 'usage' for other objects documented here. \arguments{ \item{nd}{ - a \code{\link{networkDynamic}} object + a \code{\link[networkDynamic]{networkDynamic}} object } \item{start}{ optional numeric time value at which evaluation should start (default is first observed time) diff --git a/man/paths.Rd b/man/paths.Rd index 2a0726d..629dc70 100644 --- a/man/paths.Rd +++ b/man/paths.Rd @@ -104,13 +104,12 @@ Unpublished discussions with James Moody and Martina Morris and the statnet team Useful background information (for a slightly different algorithm) can be found in: B. Bui Xuan, Afonso Ferreira, Aubin Jarry. "Computing shortest, fastest, and foremost journeys -in dynamic networks." RR-4589, 2002. https://hal.inria.fr/inria-00071996/document +in dynamic networks." RR-4589, 2002. https://inria.hal.science/inria-00071996/document B. Bui Xuan, Afonso Ferreira, Aubin Jarry. Evolving graphs and least cost journeys in dynamic networks. WiOpt'03: Modeling and Optimization in Mobile, Ad Hoc and Wireless Networks, Mar 2003, Sophia Antipolis, France. 10 p., 2003 -https://hal.inria.fr/inria-00466676/document - +https://inria.hal.science/inria-00466676/document } \author{ Skye Bender-deMoll diff --git a/man/plotpath.Rd b/man/plotpath.Rd index 5969cc2..ab1c4ad 100644 --- a/man/plotpath.Rd +++ b/man/plotpath.Rd @@ -46,17 +46,17 @@ vector of valid colors (possibly transparent) to be used for each path. Default \item{x}{object (assumed to be \code{\link{tPath}}) to be plotted on top of a static aggregate network plot} \item{\dots}{additional arguments to be passed to \code{\link[network]{plot.network}} and \code{\link{plot.tPath}}. } -\item{coord}{optional numeric matrix of coordinates for positioning vertices. See \code{\link{plot.network}}} -\item{edge.col}{color for drawing edges (paths). See \code{\link{plot.network}}} -\item{edge.label.col}{color for edge labels. Default to same color as edges. See \code{\link{plot.network}}} -\item{edge.lwd}{numeric expansion factor for edge line widths. See \code{\link{plot.network}}} -\item{edge.label.cex }{numeric expansion factor for edge labels. See \code{\link{plot.network}}} -\item{displaylabels}{logical, should vertex labels be included on the plot? See \code{\link{plot.network}}} -\item{displayisolates}{logical, should isolated vertices be included in the plot? See \code{\link{plot.network}}} -\item{jitter}{adds random noise to positions (disabled by default) See \code{\link{plot.network}}} -\item{vertex.lwd}{Vertex border line with. See \code{\link{plot.network}}} -\item{vertex.cex}{Vertex expansion factor. Default is to scale up the origin vertex for the path, and not draw the other vertices. See \code{\link{plot.network}}} -\item{vertex.col}{Color for vertices. Default is to leave them un-colored. See \code{\link{plot.network}}} +\item{coord}{optional numeric matrix of coordinates for positioning vertices. See \code{\link[network]{plot.network}}} +\item{edge.col}{color for drawing edges (paths). See \code{\link[network]{plot.network}}} +\item{edge.label.col}{color for edge labels. Default to same color as edges. See \code{\link[network]{plot.network}}} +\item{edge.lwd}{numeric expansion factor for edge line widths. See \code{\link[network]{plot.network}}} +\item{edge.label.cex }{numeric expansion factor for edge labels. See \code{\link[network]{plot.network}}} +\item{displaylabels}{logical, should vertex labels be included on the plot? See \code{\link[network]{plot.network}}} +\item{displayisolates}{logical, should isolated vertices be included in the plot? See \code{\link[network]{plot.network}}} +\item{jitter}{adds random noise to positions (disabled by default) See \code{\link[network]{plot.network}}} +\item{vertex.lwd}{Vertex border line with. See \code{\link[network]{plot.network}}} +\item{vertex.cex}{Vertex expansion factor. Default is to scale up the origin vertex for the path, and not draw the other vertices. See \code{\link[network]{plot.network}}} +\item{vertex.col}{Color for vertices. Default is to leave them un-colored. See \code{\link[network]{plot.network}}} } \details{ diff --git a/man/tDegree.Rd b/man/tDegree.Rd index dd0c485..1cb21f9 100644 --- a/man/tDegree.Rd +++ b/man/tDegree.Rd @@ -13,7 +13,7 @@ tDegree(nd, start, end, time.interval = 1, cmode = c("freeman", "indegree", "out %- maybe also 'usage' for other objects documented here. \arguments{ \item{nd}{ -the \code{\link{networkDynamic}} object to be evaluated +the \code{\link[networkDynamic]{networkDynamic}} object to be evaluated } \item{start}{ optional numeric time value at which evaluation should start (default is first observed time) diff --git a/man/tErgmStats.Rd b/man/tErgmStats.Rd index 909211d..cc67acd 100644 --- a/man/tErgmStats.Rd +++ b/man/tErgmStats.Rd @@ -13,7 +13,7 @@ tErgmStats(nd, formula, start, end, time.interval = 1, aggregate.dur, rule) %- maybe also 'usage' for other objects documented here. \arguments{ \item{nd}{ -\code{\link{networkDynamic}} object to be evaluated +\code{\link[networkDynamic]{networkDynamic}} object to be evaluated } \item{formula}{ a character string providing an ergm term name or the 'right hand side' of an ergm formula. For example \code{'~ edges + concurrent'} @@ -28,10 +28,10 @@ optional numeric time value at which evaluation should end (default is last obse optional numeric value giving time interval between evaluations (default is 1) } \item{aggregate.dur}{ -optional numeric value giving the duration of time bin to aggregate over for each evaluation (default 0). See \code{\link{network.collapse}} +optional numeric value giving the duration of time bin to aggregate over for each evaluation (default 0). See \code{\link[networkDynamic]{network.collapse}} } \item{rule}{ - character vector describing rule to be used if multiple attribute values are encountred when using non-zero \code{aggregate.dur}. Default is \code{latest}. See \code{\link{network.collapse}} for details + character vector describing rule to be used if multiple attribute values are encountred when using non-zero \code{aggregate.dur}. Default is \code{latest}. See \code{\link[networkDynamic]{network.collapse}} for details } } \details{ diff --git a/man/tSnaStats.Rd b/man/tSnaStats.Rd index 4a19115..87ac036 100644 --- a/man/tSnaStats.Rd +++ b/man/tSnaStats.Rd @@ -28,10 +28,10 @@ optional numeric time value at which evaluation should end (default is last obse optional numeric value giving time interval between evaluations (default is 1) } \item{aggregate.dur}{ -optional numeric value giving the duration of time bin to aggregate over for each evaluation (default 0). See \code{\link{network.collapse}} +optional numeric value giving the duration of time bin to aggregate over for each evaluation (default 0). See \code{\link[networkDynamic]{network.collapse}} } \item{rule}{ - character vector describing rule to be used if multiple attribute values are encountred when using non-zero \code{aggregate.dur}. Default is \code{latest}. See \code{\link{network.collapse}} for details + character vector describing rule to be used if multiple attribute values are encountred when using non-zero \code{aggregate.dur}. Default is \code{latest}. See \code{\link[networkDynamic]{network.collapse}} for details } \item{\dots}{ additional arguments to be passed on to the sna function. See docs for each function for possible arguments. diff --git a/man/tiedDuration.Rd b/man/tiedDuration.Rd index 46be8f5..a96a779 100644 --- a/man/tiedDuration.Rd +++ b/man/tiedDuration.Rd @@ -15,7 +15,7 @@ tiedDuration(nd, mode = c("duration", "counts"), %- maybe also 'usage' for other objects documented here. \arguments{ \item{nd}{ - a \code{\link{networkDynamic}} object describing the network for which durations should be calculated + a \code{\link[networkDynamic]{networkDynamic}} object describing the network for which durations should be calculated } \item{mode}{ either \code{"duration"} or \code{"count"} indicating if the sum of edge durations or the count of the number of edge events should be returned diff --git a/man/timeProjectedNetwork.Rd b/man/timeProjectedNetwork.Rd index 05bda2c..f5e642d 100644 --- a/man/timeProjectedNetwork.Rd +++ b/man/timeProjectedNetwork.Rd @@ -15,7 +15,7 @@ timeProjectedNetwork(nd, start = NULL, end = NULL, %- maybe also 'usage' for other objects documented here. \arguments{ \item{nd}{ - the \code{\link{networkDynamic}} object for which the time projected network should be constructed + the \code{\link[networkDynamic]{networkDynamic}} object for which the time projected network should be constructed } \item{start}{ optional numeric start time to be use as lower bound for binning interval (default is what is observed in network) @@ -33,22 +33,22 @@ A numeric vector containing the onset times of the networks to be extracted. Thi A numeric vector containing the terminus times of the networks to be extracted. This must be accompanied by \code{onsets} of the same length. } \item{\dots}{ -Additional arguments to \code{\link{network.collapse}} (such as \code{rule},\code{active.default} +Additional arguments to \code{\link[networkDynamic]{network.collapse}} (such as \code{rule},\code{active.default} } } \details{ -Uses \code{\link{network.collapse}} to bin the \code{nd} network into a list of static networks, aggregates them into a new network with size equal to original network size X number of slices. To assist with plotting, an edge attribute \code{edge.type} is added to all of the edges, having the value \code{'within_slice'} for edges existing the the original network and \code{'identity_arc'} for edges linking the vertices in time. Vertex attributes (possibly collapsed TEAs) are copied from the original network to the projected network. Because of the assumed directionality of time, the output network will always be directed, with the identity arcs pointing forward in time. If the input network is undirected, two corresponding directed edges (one in each direction) will be added in the projected network. Edge attributes (possibly collapsed TEAs) will be copied from the original network to the corresponding within-slice edges in the projected network. +Uses \code{\link[networkDynamic]{network.collapse}} to bin the \code{nd} network into a list of static networks, aggregates them into a new network with size equal to original network size X number of slices. To assist with plotting, an edge attribute \code{edge.type} is added to all of the edges, having the value \code{'within_slice'} for edges existing the the original network and \code{'identity_arc'} for edges linking the vertices in time. Vertex attributes (possibly collapsed TEAs) are copied from the original network to the projected network. Because of the assumed directionality of time, the output network will always be directed, with the identity arcs pointing forward in time. If the input network is undirected, two corresponding directed edges (one in each direction) will be added in the projected network. Edge attributes (possibly collapsed TEAs) will be copied from the original network to the corresponding within-slice edges in the projected network. Vertex activity is currently ignored in the projected network (\code{retain.all.vertices} is set to TRUE internally to force all time slice networks to have the same size). -As with all discrete representations of dynamic processes, the time projected graph is an approximation and may over- or under-represent some transmission potential depending on the choice of bin size. Binning is performed by \code{\link{get.networks}}, so will use its defaults if not specified. +As with all discrete representations of dynamic processes, the time projected graph is an approximation and may over- or under-represent some transmission potential depending on the choice of bin size. Binning is performed by \code{\link[networkDynamic]{get.networks}}, so will use its defaults if not specified. } \value{ -a \code{\link{network}} object that encodes a discrete time representation of the temporal evolution of the input \code{\link{networkDynamic}} object. +a \code{\link[network]{network}} object that encodes a discrete time representation of the temporal evolution of the input \code{\link[networkDynamic]{networkDynamic}} object. } \references{ James Moody (2015) Static Representations of Dynamic Networks (DRAFT) @@ -64,7 +64,7 @@ Skye Bender-deMoll (skyebend@uw.edu), James Moody \seealso{ -\code{\link{network.collapse}} +\code{\link[networkDynamic]{network.collapse}} } \examples{ data(moodyContactSim) diff --git a/man/tsna.Rd b/man/tsna.Rd index ff7b3de..71bd6d3 100644 --- a/man/tsna.Rd +++ b/man/tsna.Rd @@ -69,6 +69,6 @@ These functions can be used to compute distributions of (observed) activity dura \source{ -This package is part of the statnet suite of packages \url{http://statnet.org}. For citation information see \code{citation('tsna')}. +This package is part of the statnet suite of packages \url{https://statnet.org}. For citation information see \code{citation('tsna')}. } diff --git a/vignettes/tsna_vignette.Rmd b/vignettes/tsna_vignette.Rmd index cc82d78..ee63360 100644 --- a/vignettes/tsna_vignette.Rmd +++ b/vignettes/tsna_vignette.Rmd @@ -757,14 +757,14 @@ citation('tsna') ## Bibliography -Vincenzo Nicosia, John Tang, Cecilia Mascolo, Mirco Musolesi, Giovanni Russo, and Vito Latora (2013) Graph Metrics for Temporal Networks. https://arxiv.org/pdf/1306.0493v1.pdf +Vincenzo Nicosia, John Tang, Cecilia Mascolo, Mirco Musolesi, Giovanni Russo, and Vito Latora (2013) Graph Metrics for Temporal Networks. http://arxiv.org/pdf/1306.0493v1 Skye Bender-deMoll (2014). networkDynamicData: dynamic network datasets. R package version 0.1.0. https://CRAN.R-project.org/package=networkDynamicData B. Bui Xuan, Afonso Ferreira, Aubin Jarry. "Computing shortest, fastest, and foremost journeys -in dynamic networks". RR-4589, 2002. https://hal.inria.fr/inria-00071996/document +in dynamic networks". RR-4589, 2002. https://inria.hal.science/inria-00071996/document Carter T. Butts, Ayn Leslie-Cook, Pavel N. Krivitsky and Skye Bender-deMoll (2015). networkDynamic: Dynamic Extensions for Network Objects. R package version 0.8. https://statnet.org @@ -773,7 +773,7 @@ Carter T. Butts (2008). A Relational Event Framework for Social Action. Sociolog Carter T. Butts (2014). sna: Tools for Social Network Analysis. R package version 2.3-2. https://CRAN.R-project.org/package=sna -Gibson, D.R. (2003) 'Participation Shifts: Order and Differentiation in Group Conversation' Social Forces 81 (4): 1335-1380 https://academic.oup.com/sf/article-abstract/81/4/1335/2234586 +Gibson, D.R. (2003) 'Participation Shifts: Order and Differentiation in Group Conversation' Social Forces 81 (4): 1335-1380 https://doi.org/10.1353/sof.2003.0055 Handcock M, Hunter D, Butts C, Goodreau S, Krivitsky P and Morris M (2015). _ergm: Fit, Simulate and Diagnose Exponential-Family Models for Networks_. The Statnet Project (). R package version 3.4.0, . diff --git a/vignettes/tsna_vignette.html b/vignettes/tsna_vignette.html index d011563..729d392 100644 --- a/vignettes/tsna_vignette.html +++ b/vignettes/tsna_vignette.html @@ -13,81 +13,305 @@ tsna Package Vignette - + + - - - - + + + + - +h1.title {font-size: 38px;} +h2 {font-size: 30px;} +h3 {font-size: 24px;} +h4 {font-size: 18px;} +h5 {font-size: 16px;} +h6 {font-size: 12px;} +code {color: inherit; background-color: rgba(0, 0, 0, 0.04);} +pre:not([class]) { background-color: white } + +code{white-space: pre-wrap;} +span.smallcaps{font-variant: small-caps;} +span.underline{text-decoration: underline;} +div.column{display: inline-block; vertical-align: top; width: 50%;} +div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} +ul.task-list{list-style: none;} + +